P3792 由乃与大母神原型和偶像崇拜

人生第一道 由乃题

将每个值映射为一个随机数,然后像哈希一样判:可以通过区间的和判断出等差数列的最小值和最大值,再用区间异或值和该等差数列的异或值比较,如果相等即为连续,否则不连续

#include<bits/stdc++.h>
using namespace std;
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') f=(ch=='-')?-1:1,ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*f;
}
const int N=300005;
int a[N],b[N<<2],c2[N],opt[N],x[N],y[N],c[N<<2],pre[N<<2],n;
long long c1[N];
void add1(int x,int k){while(x<=n) c1[x]+=k,x+=x&-x;return;}
void add2(int x,int k){while(x<=n) c2[x]^=k,x+=x&-x;return;}
long long query1(int x){long long s=0;while(x) s+=c1[x],x-=x&-x;return s;}
int query2(int x){int s=0;while(x) s^=c2[x],x-=x&-x;return s;}
int main()
{
	srand(time(0));
	n=read();int m=read(),tot=n<<1;
	for(int i=1;i<=n;i++) b[n+i]=(b[i]=a[i]=read())+1;
	for(int i=1;i<=m;i++)
	{
		opt[i]=read(),x[i]=read(),y[i]=read();
		if(opt[i]==1) b[++tot]=y[i],b[++tot]=y[i]+1;
	}
	sort(b+1,b+tot+1);
	int k=unique(b+1,b+tot+1)-b-1;
	for(int i=1;i<=k;i++) c[i]=rand(),pre[i]=pre[i-1]^c[i];
	for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+k+1,a[i])-b;
	for(int i=1;i<=n;i++) add1(i,a[i]),add2(i,c[a[i]]);
	for(int i=1;i<=m;i++)
	{
		if(opt[i]==1)
			y[i]=lower_bound(b+1,b+k+1,y[i])-b,add1(x[i],y[i]-a[x[i]]),add2(x[i],c[y[i]]^c[a[x[i]]]),a[x[i]]=y[i];
		else
		{
			const int kkk=y[i]-x[i];
			long long s=(query1(y[i])-query1(x[i]-1))/(kkk+1),l=s-(kkk>>1),r=s+(kkk>>1);
			if(kkk&1) r++;
			if(l<=0||r>k) puts("yuanxing");
			else if((query2(y[i])^query2(x[i]-1))==(pre[r]^pre[l-1])) puts("damushen");
			else puts("yuanxing");
		}
	}
	return 0;
}
posted @ 2023-03-20 22:14  所见皆为虚妄  阅读(24)  评论(0编辑  收藏  举报