WA on #4
查看原帖
WA on #4
866613
sansesantongshun楼主2024/4/3 23:38

玄学调了inf遍模数

#include<bits/stdc++.h>
#define mod 122420729
using namespace std;
int n,x,y;
unsigned long long a[1200005][3],b[300005];
bool ok;
void build(int x,int l,int r)
{
	a[x][0]=0;
	a[x][1]=0;
	a[x][2]=r-l+1;
	if (l<r)
	{
		int mid=l+r>>1;
		build(x<<1,l,mid);
		build(x<<1|1,mid+1,r);
	}
}
void modify(int x,int bl,int br,int y)
{
	if (bl==br)
	{
		a[x][0]=1;
		a[x][1]=1;
	}
	else
	{
		int mid=bl+br>>1;
		if (y<=mid)
		modify(x<<1,bl,mid,y);
		else
		modify(x<<1|1,mid+1,br,y);
		a[x][0]=(a[x<<1][0]*b[br-mid]%mod+a[x<<1|1][0])%mod;
		a[x][1]=(a[x<<1|1][1]*b[mid-bl+1]%mod+a[x<<1][1])%mod;
	}
}
pair<unsigned long long,int> query(int x,int bl,int br,int l,int r,bool k)
{
	if (l<=bl && br<=r)
	return make_pair(a[x][k],a[x][2]);
	int mid=bl+br>>1;
	pair<unsigned long long,int> result=make_pair(0,0),res;
	if (k)
	{
		if (mid<r)
		{
			res=query(x<<1|1,mid+1,br,l,r,k);
			result=make_pair((result.first*b[res.second]%mod+res.first)%mod,result.second+res.second);
		}
		if (l<=mid)
		{
			res=query(x<<1,bl,mid,l,r,k);
			result=make_pair((result.first*b[res.second]%mod+res.first)%mod,result.second+res.second);
		}
	}
	else
	{
		if (l<=mid)
		{
			res=query(x<<1,bl,mid,l,r,k);
			result=make_pair((result.first*b[res.second]%mod+res.first)%mod,result.second+res.second);
		}
		if (mid<r)
		{
			res=query(x<<1|1,mid+1,br,l,r,k);
			result=make_pair((result.first*b[res.second]%mod+res.first)%mod,result.second+res.second);
		}
	}
	return result;
}
int main()
{
	cin>>n;
	for (int i=1;i<=n;++i)
	b[i]=b[i-1]*23333%mod;
	build(1,1,n);
	ok=0;
	for (int i=1;i<=n;++i)
	{
		scanf("%d",&x);
		y=min(x-1,n-x);
		modify(1,1,n,x);
		if (y && query(1,1,n,x-y,x-1,0)!=query(1,1,n,x+1,x+y,1))
		ok=1;
	}
	if (ok)
	cout<<"YES";
	else
	cout<<"NO";
}
2024/4/3 23:38
加载中...