萌妹求调
查看原帖
萌妹求调
554803
After_light楼主2024/9/23 10:35

就是线段树+hash的普通思路

#include<bits/stdc++.h>
#define int long long
#define F(i,a,b) for(int i=a;i<=b;i++)
#define R(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=2e6+7;
const int mod=1e9+7;
const int base=131;
int n,a[N],bas[N];
mt19937_64 e(time(0));
struct SGT{
	int val,val2,len;
}t[N];
inline void pushup(int k){
	t[k].val=t[k<<1].val*bas[t[k<<1|1].len]+t[k<<1|1].val;
	t[k].val2=t[k<<1|1].val2*bas[t[k<<1].len]+t[k<<1].val2;
	t[k].val%=mod;
	t[k].val2%=mod;
}
inline void build_tree(int l,int r,int k){
	t[k].len=r-l+1;
	if(l==r){
		t[k].val=0;
		t[k].val2=0;
		return ;
	}
	int mid=(l+r)>>1;
	build_tree(l,mid,k<<1);
	build_tree(mid+1,r,k<<1|1);
	pushup(k);
}
inline void update(int now_l,int now_r,int pos,int k){
	if(now_l==now_r){
		t[k].val=1;
		t[k].val2=1;
		return ;
	}
	int mid=(now_l+now_r)>>1;
	if(pos<=mid) update(now_l,mid,pos,k<<1);
	else update(mid+1,now_r,pos,k<<1|1);
	pushup(k);
}
inline int query(int now_l,int now_r,int l,int r,int k){
	if(l<=now_l&&r>=now_r){
		return t[k].val;
	}
	int mid=(now_l+now_r)>>1,ans=0;
	if(r<=mid){
		ans=query(now_l,mid,l,r,k<<1);
		ans%=mod;
	} 
	else if(l>mid){
		ans=query(mid+1,now_r,l,r,k<<1|1);
		ans%=mod;
	}
	else{
		ans=query(now_l,mid,l,r,k<<1)*bas[r-mid]+query(mid+1,now_r,l,r,k<<1|1);
		ans%=mod;
	}
	pushup(k);
	return ans;
}
inline int query2(int now_l,int now_r,int l,int r,int k){
	if(l<=now_l&&r>=now_r){
		return t[k].val2;
	}
	int mid=(now_l+now_r)>>1,ans=0;
	if(r<=mid){
		ans=query2(now_l,mid,l,r,k<<1);
		ans%=mod;
	} 
	else if(l>mid){
		ans=query2(mid+1,now_r,l,r,k<<1|1);
		ans%=mod;
	}
	else{
		ans=query2(mid+1,now_r,l,r,k<<1|1)*bas[mid-l+1]+query2(now_l,mid,l,r,k<<1);
		ans%=mod;
	}
	pushup(k);
	return ans;
}
signed main(){
	int T;
	cin>>T;
	bas[0]=1;
	F(i,1,500000){
		bas[i]=bas[i-1]*base;
		bas[i]%=mod;
	}
	while(T--){
		bool thy=true;
		cin>>n;
		F(i,1,n){
			cin>>a[i];
		}
		build_tree(1,n,1);
		int val1=0,val2=0;
		F(i,1,n){
			int sz=min(a[i]-1,n-a[i]);
	//		cout<<"a[i]:"<<a[i]<<"\n";
	//		cout<<sz<<"\n";
			if(a[i]!=1&&a[i]!=n) val1=query(1,n,a[i]-sz,a[i]-1,1);
			if(a[i]!=1&&a[i]!=n) val2=query2(1,n,a[i]+1,a[i]+sz,1);
			update(1,n,a[i],1);
	//		cout<<val1<<" "<<val2<<"\n";
	//		F(j,1,n){
	//			cout<<query(1,n,j,j,1)<<" ";
	//		}
	//		cout<<"\n";
	//		F(j,1,n){
	//			cout<<query2(1,n,j,j,1)<<" ";
	//		}
	//		cout<<"\n";
			if(a[i]==1||a[i]==n) continue;
			if(val1!=val2){
				puts("Y");
				thy=false;
				break;
			}
		}
		if(thy)puts("N");
	}
	return 0;
}

2024/9/23 10:35
加载中...