这题的数据太弱了,以至于这个代码都能AC
#include<bits/stdc++.h>
using namespace std;
struct Amadeus{
int l,r;
int v;
}t[5200005];
int n,m,tot;
int rt[30];
char a[100005];
inline int read(){
int ret=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
return ret*f;
}
void insert(int l,int r,int x,int p){
if(l==r){t[p].v++;return;}
int mid=(r-l>>1)+l;
if(x<=mid)insert(l,mid,x,t[p].l?t[p].l:t[p].l=++tot);
else insert(mid+1,r,x,t[p].r?t[p].r:t[p].r=++tot);
}
int split(int l,int r,int L,int R,int &p){
int q=++tot;
if(L<=l&&r<=R){t[q]=t[p];p=0;}
else{
int mid=(r-l>>1)+l;
if(L<=mid)t[q].l=split(l,mid,L,R,t[p].l);
if(mid<R)t[q].r=split(mid+1,r,L,R,t[p].r);
}
return q;
}
void merge(int p,int q){
t[p].v+=t[q].v;
if(t[q].l){
if(t[p].l)merge(t[p].l,t[q].l);
else t[p].l=t[q].l;
}
if(t[q].r){
if(t[p].r)merge(t[p].r,t[q].r);
else t[p].r=t[q].r;
}
}
bool query(int l,int r,int x,int p){
if(l==r)return t[p].v;
int mid=(r-l>>1)+l;
if(x<=mid&&t[p].l)return query(l,mid,x,t[p].l);
if(mid<x&&t[p].r)return query(mid+1,r,x,t[p].r);
return 0;
}
int main(){
freopen("P8796.in","r",stdin);
freopen("P8796.out","w",stdout);
scanf("%s",a+1);n=strlen(a+1);
for(int i=1;i<=26;i++)rt[i]=++tot;
for(int i=1;i<=n;i++)insert(1,n,i,rt[a[i]-'a'+1]);
m=read();
while(m--){
int l=read(),r=read();char x=getchar();getchar();char y=getchar();
int q=split(1,n,l,r,rt[x-'a'+1]);
merge(rt[y-'a'+1],q);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=26;j++)if(query(1,n,i,rt[j])){printf("%c",'a'+j-1);break;}
return 0;
}
这份代码无法处理更改区间为1-n时的操作,也就意味着数据中没有一个是包含有1-n的操作的。这就可能会把一些写的不够细腻的线段树合并放过去,比如我qwq