求助!!
  • 板块学术版
  • 楼主ZHUHK
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/11 13:17
  • 上次更新2023/10/27 07:54:37
查看原帖
求助!!
304458
ZHUHK楼主2022/10/11 13:17

题目

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10,mod=1333331,base=23;
int po[N];
struct Segment
{
	int l,r,data,len;
}tr1[N<<4],tr2[N<<4];
int 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);
}
int 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;
	int ans=0;
	if(l<=mid) ans=query1(now<<1,l,r);
	if(r>mid) ans=((long long)ans*po[tr1[now<<1|1].len]+query1(now<<1|1,l,r)%mod);
	return ans;
}
int 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;
	int ans=0;
	if(r>mid) ans=query2(now<<1|1,l,r)%mod;
	if(l<=mid) ans=((long long)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;
		int 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 13:17
加载中...