专栏文章

ABC419 D

AT_abc419_d题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioacajy
此快照首次捕获于
2025/12/02 15:57
3 个月前
此快照最后确认于
2025/12/02 15:57
3 个月前
查看原文

简要题意

给定两个长度为 NN 的小写英文字符串 SSTT,以及 MM 对整数 (L1,R1),(L2,R2),,(LM,RM)(L_1, R_1), (L_2, R_2), \ldots, (L_M, R_M)

操作规则

按顺序依次执行以下操作(i=1,2,,Mi = 1, 2, \ldots, M):
  • 交换子串:将 SS 中从第 LiL_i 到第 RiR_i 的字符与 TT 中相同位置的字符互换。
    • 示例
      S=abcdefS = \text{abcdef}T=ghijklT = \text{ghijkl},且 (Li,Ri)=(3,5)(L_i, R_i) = (3, 5),则操作后:
      • SS 变为 abijkf(原 cde 替换为 ijk
      • TT 变为 ghcdel(原 ijk 替换为 cde
输出所有 MM 次操作完成后字符串 SS 的最终结果。

分析

简单题不能说很相似,只能说一模一样,纯纯树状数组板子题。
维护 tag 进行区间异或,最后单点查就行了,具体看代码。

Code

CPP
#include<iostream>
using namespace std;
const int N=3e6+6;
bool a[N],c[N],tag[N];
int n,m;
int lowbit(int x){
	return x&(-x);
}
int ask(int x){
	bool sum=0;
	for(int i=x;i<=n;i+=lowbit(i))
		sum^=tag[i];
	return sum;
}
void change(int l,int r,int k){
	for(int i=r;i;i-=lowbit(i))
		tag[i]^=k;
	for(int i=l-1;i;i-=lowbit(i))
		tag[i]^=k;
}
string s1,s2; 
int main(){
	
	cin>>n>>m;
	cin>>s1>>s2;
	for(int i=1;i<=m;i++){
		int x,y,k;
		cin>>x>>y;
		change(x,y,1);	
	}
	for(int i=1;i<=n;i++){
		if(ask(i)==1) cout<<s2[i-1];
		else cout<<s1[i-1];
	}
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...