线段树求助大佬,空间咋都卡不过去,还有WA,救救孩子吧
查看原帖
线段树求助大佬,空间咋都卡不过去,还有WA,救救孩子吧
236296
_spy楼主2021/11/1 18:17
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
int n,m;
int a[maxn] , nnn = 0 ;

struct node{
	int mx , mn ;
	int pre , gc;
}tr[maxn << 2] , ansl ;

int pr[maxn];
map<int,int> mp ;
set<int> st[maxn];

#define lc 2 * o
#define rc 2 * o + 1
node merge(node x,node y){
	ansl.mx = max(x.mx,y.mx);
	ansl.mn = min(x.mn,y.mn);
	ansl.pre = max(x.pre,y.pre);
	ansl.gc = __gcd(x.gc,y.gc);
	return ansl;
}

void build(int o,int l,int r){
	if(l == r){
		tr[o].mx = tr[o].mn = a[l];
		if(l < n) tr[o].gc = abs(a[l] - a[l + 1]); else tr[o].gc = 0; 
		tr[o].pre = pr[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(2 * o , l , mid);
	build(2 * o + 1 , mid + 1 , r);
	tr[o] = merge(tr[lc],tr[rc]);
}

void change(int o,int l,int r,int c){
	if(l == r && r == c){
		tr[o].mx = tr[o].mn = a[l];
		tr[o].gc = abs(a[l] - a[l + 1]);
		tr[o].pre = pr[l];
		return;
	}
	int mid = (l + r) >> 1;
	if(c <= mid) change(lc,l,mid,c);
	else change(rc,mid + 1,r,c);
	tr[o] = merge(tr[lc],tr[rc]);
}

node query(int o,int l,int r,int c,int d){
	if(c <= l && r <= d){
		return tr[o];
	}
	int mid = (l + r) >> 1;
	node ans;
	ans.mx = -1 , ans.gc = 0 , ans.mn = 1e9 , ans.pre = 0;
	if(mid >= c) ans = merge(ans,query(lc,l,mid,c,d));
	if(mid < d) ans = merge(ans,query(rc,mid+1,r,c,d));
	return ans;
}

int main(){
	scanf("%d%d",&n,&m);
	int cnt = 0;
	for(int i = 1;i <= n; i++){
		scanf("%d",&a[i]);
		if(!mp[a[i]]){
			mp[a[i]] = ++cnt;
			st[cnt].insert(0);
			st[cnt].insert(n + 1);
			st[cnt].insert(i);
		}else{
			st[mp[a[i]]].insert(i);
			pr[i] = *--(st[mp[a[i]]].lower_bound(i));
		}
	}
	
	build(1,1,n);
	
	int op , x , y , z;
	while(m--){
		scanf("%d%d%d",&op,&x,&y);
		x ^= nnn , y ^= nnn;

		if( op == 1 ){
			int tmp = *st[mp[a[x]]].upper_bound(x);
			if(tmp != n + 1){
				pr[tmp] = pr[x];
				change(1,1,n,tmp);
			}//更改之前的pre
			st[mp[a[x]]].erase(x);
			a[x] = y;
			if(!mp[y]){
				mp[y] = ++ cnt;
				st[cnt].insert(0);
				st[cnt].insert(n + 1);
				st[cnt].insert(x);
				pr[x] = 0;
			}else{
				st[mp[y]].insert(x);
				pr[x] = *--(st[mp[y]].lower_bound(x));
			}
			tmp = *st[mp[y]].upper_bound(x);
			if(tmp != n + 1){
				pr[tmp] = x;
				change(1,1,n,tmp);
			}
			if(x == n) a[n + 1] = y;
			change(1,1,n,x);
			if(x > 1) change(1,1,n,x - 1);
		}
		
		if( op == 2 ){
			if(x > y) swap(x,y);
			scanf("%d",&z);
			z ^= nnn;
			ansl = query(1,1,n,x,y);
			if(z == 0) {
				if(ansl.mx != ansl.mn) printf("No\n");
				else nnn ++ , printf("Yes\n"); 
			}else{
				if(ansl.mx - ansl.mn != z * (y-x) || ansl.gc % z != 0 || ansl.pre >= x) printf("No\n");
				else nnn ++ , printf("Yes\n");
			}	 
		}
	}
	return 0;
}
2021/11/1 18:17
加载中...