对于检查是否符合“这段连续区间必须是同一种材料”的思路:
取区间和与区间内任意一个数字(代码中取了第一个),若符合条件,这个数字*区间长度应等于区间和
代码样例通过,但提交全WA
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void out(int x){
if(x>9) out(x/10);
putchar('0'+x%10);
return ;
}
int const X=5e5+100;
struct node{
int tag,ans;
};
node t[X<<2];
int n,k,x,y,tmp,num;
char s[X],op,val;
inline int ls(int rt){
return rt<<1;
}
inline int rs(int rt){
return rt<<1 | 1;
}
void pushup(int rt){
t[rt].ans=t[ls(rt)].ans+t[rs(rt)].ans;
return ;
}
void build(int rt,int L,int R){
t[rt].tag=0;
if(L==R){
t[rt].ans=s[L-1]-'A'+1;
return ;
}
int mid=(L+R)>>1;
build(ls(rt),L,mid);
build(rs(rt),mid+1,R);
pushup(rt);
return ;
}
void pushdown(int rt,int L,int R){
t[ls(rt)].tag=t[rs(rt)].tag=t[rt].tag;
int mid=(L+R)>>1;
t[ls(rt)].ans=t[rt].tag*(mid-L+1);
t[rs(rt)].ans=t[rt].tag*(R-mid);
t[rt].ans=t[rt].tag*(R-L+1);
return ;
}
void update(int rt,int L,int R,int uL,int uR,int v){ //线段树区间修改
if(uL<=L&&R<=uR){
t[rt].tag=v;
t[rt].ans=(R-L+1)*v;
return ;
}
if(t[rt].tag) pushdown(rt,L,R);
int mid=(L+R)>>1;
if(uL<=mid) update(ls(rt),L,mid,uL,uR,v);
if(mid+1<=uR) update(rs(rt),mid+1,R,uL,uR,v);
pushup(rt);
return ;
}
int query(int rt,int L,int R,int uL,int uR){ //线段树区间和查询
if(uL<=L&&R<=uR){
return t[rt].ans;
}
if(t[rt].tag) pushdown(rt,L,R);
int mid=(L+R)>>1,res=0;
if(uL<=mid) res+=query(ls(rt),L,mid,uL,uR);
if(mid+1<=uR) res+=query(rs(rt),mid+1,R,uL,uR);
return res;
}
int query_dot(int rt,int L,int R,int p){ //线段树单点查询
if(L==R) return t[rt].ans;
if(t[rt].tag) pushdown(rt,L,R);
int mid=(L+R)>>1;
if(p<=mid) return query_dot(ls(rt),L,mid,p);
else return query_dot(rs(rt),mid+1,R,p);
}
int main() {
n=rd();
scanf("%s",&s);
build(1,1,n);
k=rd();
while(k--){
scanf("%c",&op);
if(op=='A'){
x=rd(); y=rd(); scanf("%c",&val);
update(1,1,n,x,y,val-'A'+1); //修改
}
else{
x=rd(); y=rd();
if(x!=1 && y!=n && query_dot(1,1,n,x-1)==query_dot(1,1,n,y+1)){ //检查 “这段连续区间的前一个材料与后一个材料必须不相同 ”
putchar('N');putchar('o');putchar('\n');
}
else{
tmp=query(1,1,n,x,y); num=query_dot(1,1,n,x);
//tmp:区间和 num:区间内第一个数字
//若符合条件 num*区间长度 应等于 区间和
if(num*(y-x+1)==tmp){
putchar('Y');putchar('e');putchar('s');putchar('\n');
}
else{
putchar('N');putchar('o');putchar('\n');
}
}
}
}
return 0;
}
感谢.JPG