TLE40分代码求调
查看原帖
TLE40分代码求调
716965
L_zaa_L楼主2024/11/29 08:50

帮帮我吧

#include<bits/stdc++.h>
#define int long long
#define ls(x) ((x)*2)
#define rs(x) ((x)*2+1)
#define Debug(...) fprintf(stderr, __VA_ARGS__)
#define For(i,a,b) for(int i=a,i##end=b;i<=i##end;i++)
#define Rof(i,a,b) for(int i=a,i##end=b;i>=i##end;i--)
#define rep(i,  b) for(int i=1,i##end=b;i<=i##end;i++)
using namespace std;
const int N=6e5+5,base=999983,Mod=998244353;
//char buf[(1<<21)+5],*p1,*p2;
//#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
inline void chmx(int &x,int y){(x<y)&&(x=y);}
inline void chmn(int &x,int y){(x>y)&&(x=y);}
inline void Add(int &x,int y){(x=x+y+Mod)%=Mod;}
inline int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return f?-x:x;
}
void print(int n){
    if(n<0){
        putchar('-');
        n*=-1;
    }
    if(n>9) print(n/10);
    putchar(n%10+'0');
}int n,a[N];
struct XXX{
	int x,mx,mn,pre;
}tr[N<<1];
map<int,int>mp;int tot=0;
set<int>s[N];
int id[N]; 
int lst[N],nxt[N],c;
inline int gcd(int x,int y){while(y){c=y;y=x%y;x=c;}return x;}
inline int abss(int x){return x>0?x:-x;}
inline XXX pushup(XXX l,XXX r){
	XXX res;
	res.x=gcd(l.x,r.x);
	res.mx=max(l.mx,r.mx); 
	res.mn=min(l.mn,r.mn);
	res.pre=max(l.pre,r.pre);
	return res;
}int qz[N];
void build(int x,int l,int r){
	if(l==r){
		tr[x]={abss(a[l+1]-a[l]),a[l],a[l],qz[l]};
		return;
	}int mid=(l+r)>>1;
	build(ls(x),l,mid);build(rs(x),mid+1,r);
	tr[x]=pushup(tr[ls(x)],tr[rs(x)]);
}
void updata(int x,int l,int r,int p){
	if(l==r){
		tr[x]={abss(a[l+1]-a[l]),a[l],a[l],qz[l]};
		return;
	}int mid=(l+r)>>1;
	if(p<=mid) updata(ls(x),l,mid,p);
	else updata(rs(x),mid+1,r,p);
	tr[x]=pushup(tr[ls(x)],tr[rs(x)]);
}
XXX query(int x,int l,int r,int L,int R){
	if(L<=l&&r<=R) return tr[x];
	int mid=(l+r)>>1;
	if(L<=mid&&R>mid) return pushup(query(ls(x),l,mid,L,R),query(rs(x),mid+1,r,L,R));
	if(L<=mid) return query(ls(x),l,mid,L,R);
	if(R>mid)return query(rs(x),mid+1,r,L,R);
}
int nx[N];
signed main(){
//	freopen("P5278_1.in","r",stdin);
//	freopen(".out","w",stdout);
	// ios::sync_with_stdio(false);
	// cin.tie(0); cout.tie(0);
	n=read();int Q=read();
	For(i,1,n){
		a[i]=read();
		if(!mp[a[i]])mp[a[i]]=++tot,s[tot].insert(0);
		s[id[i]=mp[a[i]]].insert(i);
		qz[i]=*prev(s[id[i]].lower_bound(i));
		nx[*prev(s[id[i]].lower_bound(i))]=i;
	}
	int lastans=0;build(1,1,n);
	while(Q--){
		int op=read();
		if(op==1){
			int x=read()^lastans,y=read()^lastans;
			if(y==a[x]) continue;
			int p=mp[a[x]]; 
			s[p].erase(x);
			if(s[p].upper_bound(x)!=s[p].end()){
				int u=*s[p].upper_bound(x);
				qz[u]=qz[x];
				updata(1,1,n,u);
			}
			a[x]=y;p=mp[a[x]];
			if(!mp[a[x]])p=mp[a[x]]=++tot,s[tot].insert(0);
			else{
				if(s[p].upper_bound(x)!=s[p].end()){
					int u=*s[p].upper_bound(x);
					qz[u]=x;
					updata(1,1,n,u);
				}
			}qz[x]=*prev(s[p].lower_bound(x));
			s[p].insert(x);id[x]=p;
			updata(1,1,n,x);
		}
		else{
			int l=read()^lastans,r=read()^lastans,k=read()^lastans;
			if(l==r){
				lastans++;
				puts("Yes");continue;
			}
			XXX res=query(1,1,n,l,r);
			if(!k){
				if(res.mx==res.mn){
					puts("Yes");lastans++;
					continue;
				}
				puts("No");
				continue;
			} 
			if((res.mx-res.mn)!=(r-l)*k){
				puts("No");
				continue;
			}
			if(res.pre>=l){
				puts("No");
				continue;
			}
			int p=query(1,1,n,l,r-1).x;
			if(p!=k){
				puts("No");
				continue;
			}puts("Yes");lastans++;
		}
	}
#ifdef LOCAL
    Debug("\nMy Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
	return 0;
}
2024/11/29 08:50
加载中...