当前位置: 首页 > news >正文

2023NOIP A层联测28-小猫吃火龙果

给你一个长为 n n n 的序列,每个位置是 A , B , C A,B,C A,B,C 三个中的一个物品。

A A A B B B B B B C C C C C C A A A

现在有 m m m 次操作,每次操作有两种:

  1. 区间修改:给出 l , r , x , y l,r,x,y l,r,x,y,表示将 [ l , r ] [l,r] [l,r] 区间内所有的 x x x 改成 y y y,所有的 y y y 改成 x x x(两种修改同时进行)。

  2. 区间询问:给出 l , r , x l,r,x l,r,x,现在沙奈朵一开始手上拿着的是一个 x x x 物品。沙奈朵从序列的 l l l 位置开始一路走到 r r r 位置结束,每次他需要对比他手上的物品和当前序列位置的物品,如果手上的物品可以吃掉当前序列位置的物品,则手上的物品不变,否则手上的物品变成当前序列位置的物品。区间询问操作对序列没有任何修改。 求走完了 [ l , r ] [l,r] [l,r] 这个区间后,沙奈朵手上的物品是什么。对区间 [ l , r ] [l,r] [l,r] 中的每一个位置,包括端点,都需要执行操作。

n , m ≤ 2 × 1 0 5 n,m\le2\times10^5 n,m2×105


考虑用分块维护。由于有交换两种字母的操作,那么对于每个就要维护三个字母所有置换( 6 6 6 种)。将 A B C , A C B , B A C , B C A , C A B , C B A ABC,ACB,BAC,BCA,CAB,CBA ABC,ACB,BAC,BCA,CAB,CBA 分别表示为 0 , 1 , 2 , 3 , 4 , 5 0,1,2,3,4,5 0,1,2,3,4,5;将修改操作交换 A B , A C , B C AB,AC,BC AB,AC,BC 分别表示为 0 , 1 , 2 0,1,2 0,1,2;记块长为 B B B


c x , y c_{x,y} cx,y 表示字母是 y y y,经过置换 x x x 会变成的字母。
b x , y b_{x,y} bx,y 表示经过修改 y y y 后,置换 x x x 会变成的置换。
t o i d , x , y to_{id,x,y} toid,x,y 表示第 i d id id 个块置换为 x x x,开始是字母 y y y,走完这个块后所变成的字母。
t i d t_{id} tid 表示第 i d id id 个块的置换。

显然 c , b c,b c,b 可以打表, t o to to 可以 O ( B ) O(B) O(B) 求出。

下面考虑维护。

  • 修改。对于散块先更新所在的块的真实值,然后直接修改,再 O ( B ) O(B) O(B) 求出 t o i d to_{id} toid;对于整块就用 b b b 更改 t i d t_{id} tid 即可。
  • 查询。对于散块就直接暴力比对;对于整块就用之前求出的 t o to to 更新答案。

时间复杂度 O ( n n ) O(n\sqrt n) O(nn ),但是由于修改时对于散块的求 t o to to 的时间复杂度实际上要带上 18 18 18 的常数,所以块长取 ⌈ n 18 ⌉ \sqrt{\lceil\frac n{18}\rceil} 18n 比较合适。

具体实现参照代码:

#include<bits/stdc++.h>
#define getnxt(now,x) (now==(x+1)%3?x:now)
using namespace std;
const int N=2e5+1;
int n,m,block,to[2000][6][3],t[2000];
int c[6][3]={{0,1,2},{0,2,1},{1,0,2},{1,2,0},{2,0,1},{2,1,0}};
int b[6][3]={{2,5,1},{3,4,0},{0,3,4},{1,2,5},{5,1,2},{4,0,3}};
char a[N];
void renew(int id)
{int l=id*block+1,r=min(id*block+block,n);for(int i=l;i<=r;i++) a[i]=c[t[id]][a[i]-65]+65;t[id]=0;
}
void update(int id)
{int l=id*block+1,r=min(id*block+block,n);for(int x=0;x<6;x++){for(int y=0;y<3;y++){to[id][x][y]=y;for(int i=l;i<=r;i++){to[id][x][y]=getnxt(to[id][x][y],c[x][a[i]-65]);}}}
}
int main()
{freopen("training.in","r",stdin);freopen("training.out","w",stdout);cin.tie(0)->sync_with_stdio(0);cin>>n>>m>>(a+1);block=sqrt((n+17)/18);for(int i=0;i<=(n+block-1)/block;i++) update(i);for(int i=1,op,l,r;i<=m;i++){char x,y;cin>>op>>l>>r>>x;if(op){int minr=min((l-1)/block*block+block,r),id=(l-1)/block;x-=65;while(l<=minr){x=getnxt(x,c[t[id]][a[l]-65]);l++;}while(r-l+1>=block){id=(l-1)/block;x=to[id][t[id]][x];l+=block;}id=(l-1)/block;while(l<=r){x=getnxt(x,c[t[id]][a[l]-65]);l++;}cout<<char(x+65)<<"\n";}else{cin>>y;if(x==y) continue;if(x>y) swap(x,y);int type=(x=='A'?y=='B'?0:1:2);int minr=min((l-1)/block*block+block,r),id=(l-1)/block;renew(id);while(l<=minr){if(a[l]==x) a[l]=y;else if(a[l]==y) a[l]=x;l++;}update(id);while(r-l+1>=block){t[(l-1)/block]=b[t[(l-1)/block]][type];l+=block;}renew(id=(l-1)/block);while(l<=r){if(a[l]==x) a[l]=y;else if(a[l]==y) a[l]=x;l++;}update(id);}}
}

相关文章:

2023NOIP A层联测28-小猫吃火龙果

给你一个长为 n n n 的序列&#xff0c;每个位置是 A , B , C A,B,C A,B,C 三个中的一个物品。 A A A 吃 B B B&#xff0c; B B B 吃 C C C&#xff0c; C C C 吃 A A A。 现在有 m m m 次操作&#xff0c;每次操作有两种&#xff1a; 区间修改&#xff1a;给出 l , r…...

C# Dictionary与List的用法区别与联系

C#是一门广泛应用于软件开发的编程语言&#xff0c;其中Dictionary和List是两种常用的集合类型。它们在存储和操作数据时有着不同的特点和用途。本文将详细探讨C# Dictionary和List的用法区别与联系&#xff0c;并通过代码示例进行对比&#xff0c;以帮助读者更好地选择适合自己…...

Git应用(1)

一、Git Git(读音为/gɪt/。中文 饭桶 )是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 了解更多可到GIT官网&#xff1a;Git - Downloads GIT一般工作流程如下&#xff1a; 1&#xff0e;从远程仓库中克隆 Git 资源作为本地…...

【Java】Netty创建网络服务端客户端(TCP/UDP)

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Netty创建网络服务端客户端示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更…...

Android 设计模式--单例模式

一&#xff0c;定义 单例模式就是确保某一个类只有一个实例&#xff0c;而且自行实例化&#xff0c;并向整个系统提供这个实例 二&#xff0c;使用场景 确保某个类只有一个对象的使用场景&#xff0c;避免产生多个对象消耗过多的资源&#xff0c;或者某种类型的对象只应该有…...

语音识别与自然语言处理(NLP):技术前沿与未来趋势

语音识别与自然语言处理&#xff08;NLP&#xff09;&#xff1a;技术前沿与未来趋势 随着科技的快速发展&#xff0c;语音识别与自然语言处理&#xff08;NLP&#xff09;技术逐渐成为人工智能领域的研究热点。这两项技术的结合&#xff0c;使得机器能够更好地理解和处理人类语…...

k8s-docker二进制(1.28)的搭建

二进制文件-docker方式 1、准备的服务器 角色ip组件k8s-master1192.168.11.111kube-apiserver,kube-controller-manager,kube-scheduler,etcdk8s-master2192.168.11.112kube-apiserver,kube-controller-manager,kube-scheduler,etcdk8s-node1192.168.11.113kubelet,kube-prox…...

【代码随想录】算法训练计划18

1、513. 找树左下角的值 题目&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路&#xff1a; 递归&#xff0c;规则&#xff0c;基本可以自己写出来 var maxDepth int var res int fun…...

Leetcode刷题详解—— 组合总和

1. 题目链接&#xff1a;39. 组合总和 2. 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些…...

Echarts柱状体实现滚动条动态滚动

当我们柱状图中X轴数据太多的时候&#xff0c;会自动把柱形的宽度挤的很细&#xff0c;带来的交互非常不好&#xff0c;因此就有一个属性来解决&#xff1a;dataZoom 第一种简易的版本&#xff0c;横向滚动。 dataZoom: {show: true, // 为true 滚动条出现realtime: true, // 实…...

SplayTree高分测试用例

测试用例结果展示 覆盖率 变异得分 测试注意点 从SplayTree测起&#xff0c;然后再测SubSplayTree&#xff0c;因为前者调用后者。SplaySubTree的remove方法大部分内容需要通过反射才能测到。value和index在SplayTree当中都不是唯一的。一个index可能对应多个value。 不足之…...

制作麒麟V10-server-sp2镜像

1.挂载iso 文件到目录 mount -o loop /xxx.iso /mnt 这样mnt 目录下会有iso 解压相关的文件 2.修改源文件内容 vim /etc/yum.repos.d/ kylin_x86_64.repo 将里面的所有的源enabled 都改成 0 并添加一个新的源 [ks10-local] name Kylin Linux Advanced Server 10 - Local base…...

2.docker镜像的导入导出

目录 概述docker 常用命令下载导出导入镜像结束 概述 docker 常用命令 本章节使用到的命令&#xff0c;总结在此&#xff0c;后面有使用案例。 命令作用docker images显示镜像docker rmi $(docker images -q)删除系统上所有的镜像docker rmi -f强制删除多个镜像 &#xff1a…...

bs4介绍和遍历文档树、搜索文档树、案例:爬美女图片、 bs4其它用法、css选择器

bs4介绍和遍历文档树 BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库&#xff0c;解析库 需要安装模块&#xff1a;pip install beautifulsoup4 使用 解析库可以使用 lxml&#xff0c;速度快&#xff08;必须安装&#xff09; 可以使用python内置的 # html…...

微服务-开篇-个人对微服务的理解

从吃饭说起 个人理解新事物的时候喜欢将天上飞的理念转换成平常生活中的实践&#xff0c;对比理解这些高大上的名词&#xff0c;才能让我们减少恐慌的同时加深理解。废话不多说&#xff0c;我们从吃饭开始说起&#xff0c;逐渐类比出微服务的思想。 &#xff08;个人见解&…...

机器学习算法-集成学习

概念 集成学习是一种机器学习方法&#xff0c;它通过构建并结合多个机器学习器&#xff08;基学习器&#xff09;来完成学习任务。集成学习的潜在思想是即便某一个弱分类器得到了错误的预测&#xff0c;其他的弱分类器也可以将错误纠正回来。集成学习通常被视为一种元算法&…...

LINUX入门篇【4】开发篇--开发工具vim的使用

前言&#xff1a; 从这一篇开始&#xff0c;我们将正式进入使用LINUX进行写程序和开发的阶段&#xff0c;可以说&#xff0c;由此开始&#xff0c;我们才开始真正去使用LINUX。 介绍工具&#xff1a; 1.LINUX软件包管理器yum&#xff1a; 1.yum的介绍&#xff1a; 在LINUX…...

代码随想录算法训练营Day 50 || 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 力扣题目链接 给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 你不能同时…...

【C语言】【数据结构】【环形链表判断是否带环并返回进环节点】有数学推导加图解

1.判断是否带环&#xff1a; 用快慢指针 slow指针一次走一步&#xff0c;fast指针一次走两步 当两个指针相遇时&#xff0c;链表带环&#xff1b;两个指针不能相遇时&#xff0c;当fast走到倒数第一个节点或为空时&#xff0c;跳出循环返回空指针。 那么slow指针一次走一步&a…...

漏洞扫描-nuclei-poc编写

0x00 nuclei Nuclei是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发&#xff0c;具有很强的可配置性、可扩展性和易用性。 提供TCP、DNS、HTTP、FILE 等各类协议的扫描&#xff0c;通过强大且灵活的模板&#xff0c;可以使用Nuclei模拟各种安全检查。 …...

Qwen3-ASR-1.7B在Java项目中的集成与性能调优

Qwen3-ASR-1.7B在Java项目中的集成与性能调优 1. 引言 语音识别技术正在快速改变我们与系统交互的方式。在企业级Java应用中&#xff0c;集成高质量的语音识别能力可以为用户带来更自然的交互体验&#xff0c;比如语音输入、实时转录、智能客服等场景。 Qwen3-ASR-1.7B作为一…...

CORDIC算法在嵌入式系统中的高效sin()函数实现(C语言)

1. CORDIC算法&#xff1a;嵌入式系统的三角函数救星 第一次在嵌入式项目里实现正弦函数时&#xff0c;我盯着STM32的128KB Flash发愁——标准数学库的sin()函数居然要占用20KB&#xff01;直到遇见CORDIC算法&#xff0c;这个用加减法和移位就能计算三角函数的魔法。想象你手里…...

Godot游戏资源解包终极指南:一键提取PCK文件所有资产

Godot游戏资源解包终极指南&#xff1a;一键提取PCK文件所有资产 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 想要探索Godot游戏中的精美资源却无从下手&#xff1f;面对神秘的PCK文件格式感到困…...

LinkSwift网盘直链下载助手:告别龟速下载的终极解决方案

LinkSwift网盘直链下载助手&#xff1a;告别龟速下载的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

解决Mac多设备滚动冲突:Scroll Reverser让触控板与鼠标和谐共存

解决Mac多设备滚动冲突&#xff1a;Scroll Reverser让触控板与鼠标和谐共存 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否在MacBook上使用触控板时习惯"自然滚动&q…...

STM32CubeIDE标准库开发环境配置全攻略

1. STM32CubeIDE开发环境入门指南 第一次接触STM32CubeIDE的开发者可能会被这个集成开发环境的强大功能所震撼。作为ST官方推出的免费工具&#xff0c;它集成了STM32CubeMX配置工具和基于Eclipse的IDE环境&#xff0c;特别适合从零开始学习STM32开发的工程师。我刚开始使用时也…...

从LangChain到AgentOS:SITS2026圆桌发布的AIAgent架构成熟度评估矩阵(含6维18项量化评分标准)

第一章&#xff1a;SITS2026圆桌&#xff1a;AIAgent架构的未来方向 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026圆桌讨论中&#xff0c;来自DeepMind、Anthropic与中科院自动化所的架构师一致指出&#xff1a;下一代AI Agent将不再以“单体推理模型”为核心&…...

NVIDIA Profile Inspector终极指南:解锁显卡隐藏设置,轻松提升游戏性能

NVIDIA Profile Inspector终极指南&#xff1a;解锁显卡隐藏设置&#xff0c;轻松提升游戏性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款功能强大的显卡配置工具&…...

gh_mirrors/ema/emacs.d的拼写检查:wucuo与flyspell对比

gh_mirrors/ema/emacs.d的拼写检查&#xff1a;wucuo与flyspell对比 【免费下载链接】emacs.d Fast and robust Emacs setup. 项目地址: https://gitcode.com/gh_mirrors/ema/emacs.d 在gh_mirrors/ema/emacs.d项目中&#xff0c;拼写检查是提升代码质量和文档准确性的重…...

SimCLR项目扩展指南:自定义数据增强与模型架构开发

SimCLR项目扩展指南&#xff1a;自定义数据增强与模型架构开发 【免费下载链接】SimCLR PyTorch implementation of SimCLR: A Simple Framework for Contrastive Learning of Visual Representations 项目地址: https://gitcode.com/gh_mirrors/sim/SimCLR SimCLR&…...