求调
  • 板块CF452F Permutation
  • 楼主ZHUHK
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/11 22:53
  • 上次更新2023/10/27 07:50:14
查看原帖
求调
304458
ZHUHK楼主2022/10/11 22:53
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=3e5+10,mod=1e9+7,base=11;
long long po[N];
struct Segment
{
	int l,r,len;
	long long data;
}tr1[N<<4],tr2[N<<4];
LL merge(Segment a,Segment b){
	return a.data*po[b.len]%mod+b.data%mod;
}
void pushup(int p){
	tr1[p].data=merge(tr1[p<<1],tr1[p<<1|1]);
	tr2[p].data=merge(tr2[p<<1|1],tr2[p<<1]);
	tr1[p].len=tr2[p].len=tr1[p<<1].len+tr1[p<<1|1].len;
}
void build(int now,int l,int r){
	tr1[now].l=tr2[now].l=l;
	tr2[now].r=tr1[now].r=r;
	if(l==r){
		tr1[now].data=tr2[now].data=0;
		tr1[now].len=tr2[now].len=1;return ;
	} 
	int mid=(l+r)>>1;
	build(now<<1,l,mid);build(now<<1|1,mid+1,r);
	pushup(now);
}
void modify(int now,int x,int val)
{
	if(tr1[now].l==tr1[now].r) {
		tr1[now].data=tr2[now].data=val;return ;
	}
	int mid=(tr1[now].l+tr1[now].r)>>1;
	if(x<=mid) modify(now<<1,x,val);
	else modify(now<<1|1,x,val);
	pushup(now);
}
LL query1(int now,int l,int r)
{
	if(l<=tr1[now].l&&tr1[now].r<=r) return tr1[now].data;
	int mid=(tr1[now].l+tr1[now].r)>>1;
	long long ans=0;
	if(l<=mid) ans=query1(now<<1,l,r);
	if(r>mid) ans=(ans*po[tr1[now<<1|1].len]+query1(now<<1|1,l,r))%mod;
	return ans;
}
LL query2(int now,int l,int r){
	if(l<=tr2[now].l&&tr2[now].r<=r) return tr2[now].data;
	int mid=(tr2[now].l+tr2[now].r)>>1;
	long long ans=0;
	if(r>mid) ans=query2(now<<1|1,l,r)%mod;
	if(l<=mid) ans=(ans*po[tr2[now<<1].len]+query2(now<<1,l,r))%mod;
	return ans;
}
int n;
int main(){
	
	scanf("%d",&n);
	po[0]=1;
	for(int i=1;i<=n;i++) po[i]=po[i-1]*base%mod;	
	build(1,1,n);
	for(int i=1;i<=n;i++){
		int t;
		scanf("%d",&t);
		modify(1,t,1);
		int l=min(t-1,n-t);
		
		if(l<=0) continue;
		LL d1=query1(1,t-l,t-1),d2=query2(1,t+1,t+l);
		if(d1!=d2){
			cout<<"YES"<<endl;return 0;
		}
	}
	cout<<"NO"<<endl;
	return 0;
}
2022/10/11 22:53
加载中...