WA on #22 求助
查看原帖
WA on #22 求助
555065
ChrysanthBlossom楼主2023/12/4 21:47

rt

感觉这么多个点才WA,应该可能大概是哈希的问题

#include<bits/stdc++.h>
#define ri register int
#define ll long long
#define ls i<<1
#define rs i<<1|1
#define mkp make_pair
using namespace std;
const int maxn=1e5+7;
const int mod=1e9+7;
const int base=1e5+7;
// 19:44-
const int invbase=193276472;
ll gsm[maxn];
ll invgsm[maxn];
struct hsh{
	ll val,len;
	bool operator == (const hsh &x)const{
		return val==x.val&&len==x.len;
	}
	bool operator != (const hsh &x)const{
		return val!=x.val||len!=x.len; 
	}
	hsh operator + (const hsh &x)const{
		if(x.len<0){
			cout<<"you are big shabi\n";
		}
		return (hsh){(val+x.val*gsm[len]%mod)%mod,len+x.len};
	}
	hsh operator - (const hsh &x)const{
//		cout<<val<<' '<<x.val<<' '<<x.len<<' '<<(val-x.val+mod)*invgsm[x.len]%mod<<endl;
		return (hsh){(val-x.val+mod)*invgsm[x.len]%mod,len-x.len};
	}
};
int n;
int a[maxn];
struct SegT{
	struct node{
		int l,r;
		hsh lh,rh,hh;
		bool ok;
	}tree[maxn<<2];
	hsh get_left(int i,int len){
		if(len==0)return (hsh){0,0};
		if(len==tree[i].lh.len)return tree[i].lh;
		if(len<=tree[ls].lh.len)return get_left(ls,len);
		return tree[ls].lh+(get_left(rs,len-tree[ls].lh.len+tree[ls].rh.len)-tree[ls].rh);
	}
	hsh get_right(int i,int len){
		if(len==0)return (hsh){0,0};
		if(len==tree[i].rh.len)return tree[i].rh;
		if(len<=tree[rs].rh.len)return get_right(rs,len);
		return tree[rs].rh+(get_right(ls,len-tree[rs].rh.len+tree[rs].lh.len)-tree[rs].lh);
	}
	void push_up(int i){
		tree[i].ok=tree[ls].ok&tree[rs].ok;
		if(tree[ls].rh.len<=tree[rs].lh.len){
			if(get_left(rs,tree[ls].rh.len)==tree[ls].rh){
				tree[i].lh=tree[ls].lh+(tree[rs].lh-tree[ls].rh);
				tree[i].rh=tree[rs].rh;
			}else tree[i].ok=0;
		}
		else{
			if(get_right(ls,tree[rs].lh.len)==tree[rs].lh){
				tree[i].lh=tree[ls].lh;
				tree[i].rh=tree[rs].rh+(tree[ls].rh-tree[rs].lh);
//				if(tree[i].rh.val==base){
//					cout<<(tree[ls].rh-tree[rs].lh).val<<endl;
//				}
			}else tree[i].ok=0;
		}
	}
	void build(int i,int l,int r){
		tree[i].l=l,tree[i].r=r;
		tree[i].ok=1;
		if(tree[i].l==tree[i].r){
			if(a[l]>0){
				tree[i].lh=(hsh){0,0};
				tree[i].rh=(hsh){a[l],1};
			}
			else{
				tree[i].lh=(hsh){-a[l],1};
				tree[i].rh=(hsh){0,0};
			}return;
		}
		int mid=l+r>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		push_up(i);
	}
	void update(int i,int p,int k){
		if(tree[i].l==tree[i].r){
			if(k>0){
				tree[i].lh=(hsh){0,0};
				tree[i].rh=(hsh){k,1};
			}
			else{
				tree[i].lh=(hsh){-k,1};
				tree[i].rh=(hsh){0,0};
			}return;
		}
		int mid=tree[i].l+tree[i].r>>1;
		if(p<=mid)update(ls,p,k);
		else update(rs,p,k);
		push_up(i);
	}
	pair<bool,pair<hsh,hsh> > query(int i,int l,int r){
		if(l<=tree[i].l&&tree[i].r<=r){
			return mkp(tree[i].ok,mkp(tree[i].lh,tree[i].rh));
		}
		int mid=tree[i].l+tree[i].r>>1;
		if(l<=mid&&r>mid){
			pair<bool,pair<hsh,hsh> >a,b,ans;
			a=query(ls,l,r);
			b=query(rs,l,r);
			ans.first=a.first&b.first;
			if(!ans.first){
//				ans.second=mkp(hsh{0,0},0);
				return ans;
			}
			if(a.second.second.len<=b.second.first.len){
				if(a.second.second==get_left(rs,a.second.second.len)){
					ans.second.first=a.second.first+(b.second.first-a.second.second);
					ans.second.second=b.second.second;
				}
				else {
					ans.first=0;
				}
			}
			else{
				if(b.second.first==get_right(ls,b.second.first.len)){
					ans.second.first=a.second.first;
					ans.second.second=b.second.second+(a.second.second-b.second.first);
				}
				else {
					ans.first=0;
				}
			}
//			cout<<tree[i].l<<' '<<tree[i].r<<' '<<ans.first<<' '<<ans.second.first.val<<' '<<ans.second.first.len<<' '<<ans.second.second.val<<' '<<ans.second.second.len<<endl;
			return ans;
		}
		else if(l<=mid){
			return query(ls,l,r);
		}
		else{
			return query(rs,l,r);
		}
	}
}tree;
int k;
int main(){
	ios::sync_with_stdio(0);
//	cout<<1ll*base*invbase%mod;
	cin>>n>>k;
	for(ri i=1;i<=n;i++)cin>>a[i];
	gsm[0]=invgsm[0]=1;
	for(ri i=1;i<=n;i++){
		gsm[i]=gsm[i-1]*base%mod;
		invgsm[i]=invgsm[i-1]*invbase%mod;
	}
//	for(ri i=1;i<=n;i++){
//		cout<<invgsm[i]<<' ';
//	}
//	cout<<endl;
	tree.build(1,1,n);
	int q;cin>>q;
	while(q--){
		int op,a,b;cin>>op>>a>>b;
		if(op==1){
			tree.update(1,a,b);
		}else{
			pair<bool,pair<hsh,hsh> >ans=tree.query(1,a,b);
//			cout<<ans.second.first.len<<' '<<ans.second.second.len<<endl;
			cout<<((ans.first&&ans.second.second.len==0&&ans.second.first.len==0)?"Yes":"No")<<endl;
		}
//		for(ri i=1;i<=n<<1;i++)cout<<tree.tree[i].l<<' '<<tree.tree[i].r<<' '<<tree.tree[i].ok<<' '<<tree.tree[i].lh.val<<' '<<tree.tree[i].rh.val<<endl;
	}
	return 0;
}
/*
10 10
10 4 2 -2 1 -1 -4 8 -8 -10
8
1 1 4
1 10 -4
2 6 9
1 3 4
1 4 -4
2 2 8
2 3 4
2 2 9
*/
2023/12/4 21:47
加载中...