个人思路 求hack
查看原帖
个人思路 求hack
398310
hundunqidian楼主2023/6/3 13:45

对于检查是否符合“这段连续区间必须是同一种材料”的思路:

取区间和与区间内任意一个数字(代码中取了第一个),若符合条件,这个数字*区间长度应等于区间和

代码样例通过,但提交全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

2023/6/3 13:45
加载中...