90分。。。。第一个点wa在199830行,淦
查看原帖
90分。。。。第一个点wa在199830行,淦
177604
LXH5514楼主2021/8/3 09:22

评测记录 基本没什么人跟我wa在同一个地方,调了两天了,实在调不出来,尽力了。。。。 求助大佬

#include<bits/stdc++.h>
using namespace std;
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c-'0'),c=getchar();
	return x*f;
}
const int MAXN=3*1e5+10,inf=1e9+10;
int n,m,sum;
int a[MAXN],b[MAXN*2],last[MAXN],cnt,g[MAXN];
map<int,int>mm;
set<int>d[MAXN*2];
int gcd(int x,int y)
{
	if(y==0)return x;
	return gcd(y,x%y);
}
struct node
{
	int g,l,minx,maxn; 
}shu[MAXN*4];
void update(int now)
{
//	if(shu[now*2].g==0||shu[now*2].g==0)shu[now].g=0;
//	else
	shu[now].g=gcd(shu[now*2].g,shu[now*2+1].g);
	shu[now].l=max(shu[now*2].l,shu[now*2+1].l);
	shu[now].minx=min(shu[now*2].minx,shu[now*2+1].minx);
	shu[now].maxn=max(shu[now*2].maxn,shu[now*2+1].maxn);
	return ;
}
void build(int now,int l,int r)
{
	if(l==r)
	{
		if(g[l]<0)shu[now].g=-g[l];
		else shu[now].g=g[l];
		shu[now].l=last[l];
		shu[now].maxn=shu[now].minx=b[a[l]];
		return ;
	}
	int mid=(l+r)>>1;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	update(now);
}
void change1(int now,int l,int r,int x,int y)
{
	if(l==r)
	{
		shu[now].l=y;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)change1(now*2,l,mid,x,y);
	else change1(now*2+1,mid+1,r,x,y);
	update(now);
}
void change3(int now,int l,int r,int x,int y)
{
	if(l==r)
	{
		shu[now].minx=shu[now].maxn=y;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)change3(now*2,l,mid,x,y);
	else change3(now*2+1,mid+1,r,x,y);
	update(now);
}
void change2(int now,int l,int r,int x,int c)
{
	if(l==r)
	{
		if(c<0)shu[now].g=-c;
		else shu[now].g=c;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)change2(now*2,l,mid,x,c);
	else change2(now*2+1,mid+1,r,x,c);
	update(now);
}
void xg(int x,int y)
{
	set<int>::iterator it1=d[a[x]].lower_bound(x),it2=it1;
	it1++;it2--;
	if(it1!=d[a[x]].end())
	{
	last[*it1]=*it2;
	change1(1,1,n,*it1,*it2);
	}
	if(mm.find(y)==mm.end())
	{
		mm[y]=++cnt;
		b[cnt]=y;
	}
	d[a[x]].erase(x);
	d[mm[y]].insert(x);
	it1=d[mm[y]].lower_bound(x);it2=d[mm[y]].upper_bound(x);
	if(it2!=d[mm[y]].end())
	{
		change1(1,1,n,*it2,x);
		last[*it2]=x;
	}
	if(it1!=d[mm[y]].begin())
	{
		it1--;
		change1(1,1,n,x,*it1);
		last[x]=*it1;
	}
	else
	{
		change1(1,1,n,x,0);
		last[x]=0;
	}
	if(x>1)
	{
		change2(1,1,n,x,y-b[a[x-1]]);
		g[x]=y-b[a[x-1]];
	}
	else{
		change2(1,1,n,x,y);
		g[x]=y;
	}
	if(x+1<=n)
	{
		change2(1,1,n,x+1,b[a[x+1]]-y);
		g[x]=b[a[x+1]]-y;
	}
	change3(1,1,n,x,y);
	a[x]=mm[y];
}
int query1(int now,int l,int r,int x,int y)
{
	if(x>y)return 0;
	if(l>=x&&r<=y)return shu[now].g;
	int mid=(l+r)>>1;
	if(x<=mid&&mid<y)return gcd(query1(now*2,l,mid,x,y),query1(now*2+1,mid+1,r,x,y));
	if(x<=mid)return query1(now*2,l,mid,x,y);
	return query1(now*2+1,mid+1,r,x,y);
}
int query2(int now,int l,int r,int x,int y)
{
	if(l>=x&&r<=y)return shu[now].l;
	int mid=(l+r)>>1;
	int num1=0,num2=0;
	if(x<=mid)num1=query2(now*2,l,mid,x,y);
	if(mid<y)num2=query2(now*2+1,mid+1,r,x,y);
	return max(num1,num2);
}
int query3(int now,int l,int r,int x,int y)
{
	if(l>=x&&r<=y)return shu[now].minx;
	int mid=(l+r)>>1;
	int num1=inf,num2=inf;
	if(x<=mid)num1=query3(now*2,l,mid,x,y);
	if(mid<y)num2=query3(now*2+1,mid+1,r,x,y);
	return min(num1,num2);
}
int query4(int now,int l,int r,int x,int y)
{
	if(l>=x&&r<=y)return shu[now].maxn;
	int mid=(l+r)>>1;
	int num1=0,num2=0;
	if(x<=mid)num1=query4(now*2,l,mid,x,y);
	if(mid<y)num2=query4(now*2+1,mid+1,r,x,y);
	return max(num1,num2);
}
signed main()
{
	n=read();m=read();
	for(int i=1;i<=n;i++)
	a[i]=read(),b[i]=a[i];
	for(int i=1;i<=n;i++)
	g[i]=a[i]-a[i-1];
	sort(b+1,b+1+n);
	cnt=unique(b+1,b+1+n)-b-1;
	for(int i=1;i<=cnt;i++)
	mm[b[i]]=i;
	for(int i=1;i<=n;i++)
	a[i]=mm[a[i]];
	for(int i=1;i<=n;i++)
	if(!d[a[i]].empty())
	{
		last[i]=*(--d[a[i]].end()),d[a[i]].insert(i);
	}
	else last[i]=0,d[a[i]].insert(i);
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int opt;
		opt=read();
		if(opt==1)
		{
			int x,y;
			x=read();
			y=read();
			x^=sum;
			y^=sum;
			xg(x,y);
		}
		else
		{
			int l,r,k;
			l=read();
			r=read();
			k=read();
			l^=sum;
			r^=sum;
			k^=sum;
			int x,y,xx,yy;
			x=query1(1,1,n,l+1,r);y=query2(1,1,n,l,r);
			xx=query3(1,1,n,l,r);yy=query4(1,1,n,l,r);
			if((k==0&&xx==yy)||(l==r)||(xx+(r-l)*k==yy&&x==k&&y<l))
			{
				printf("Yes\n");
				sum++;
				continue;
			}
			printf("No\n");
		}
	}
 	return 0;
}

码风很丑。。。

2021/8/3 09:22
加载中...