MnZn求调
查看原帖
MnZn求调
1248522
mlvx楼主2024/7/16 08:45

AC#1~5,其余WA

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define pl (p<<1)
#define pr (p<<1|1)
const int N=5e5+10,base=233,mod=998244353;
int T,n,now,a[N];ll ans1,ans2,Pow[N],tr1[N<<2],tr2[N<<2];
void update(int l,int r,int k,int p){
	if(l==r)return tr1[p]=tr2[p]=1,void();
	int mid=l+r>>1;
	if(k<=mid)update(l,mid,k,pl);
	else update(mid+1,r,k,pr);
	tr1[p]=(tr1[pl]*Pow[r-mid]%mod+tr1[pr])%mod,tr2[p]=(tr2[pl]+tr2[pr]*Pow[mid-l+1]%mod)%mod;
}void query1(int l,int r,int le,int ri,int p){
	if(l>=le&&r<=ri)return ans1=(ans1+tr1[p]*Pow[now]%mod)%mod,now+=r-l+1,void();
	int mid=l+r>>1;
	if(ri>mid)query1(mid+1,r,le,ri,pr);
	if(le<=mid)query1(l,mid,le,ri,pl);
}void query2(int l,int r,int le,int ri,int p){
	if(l>=le&&r<=ri)return ans2=(ans2+tr2[p]*Pow[now]%mod)%mod,now+=r-l+1,void();
	int mid=l+r>>1;
	if(le<=mid)query2(l,mid,le,ri,pl);
	if(ri>mid)query2(mid+1,r,le,ri,pr);
}void solve(){
	for(int i=1,len;i<=n;i++){
		update(1,n,a[i],1),len=min(a[i],n-a[i]+1),ans1=ans2=now=0,query1(1,n,a[i]-len+1,a[i]+len-1,1),now=0,query2(1,n,a[i]-len+1,a[i]+len-1,1);
		if(ans1!=ans2)return puts("Y"),void();
	}puts("N");
}main(){
	cin>>T,Pow[0]=1;
	for(int i=1;i<=n;i++)Pow[i]=Pow[i-1]*base%mod;
	while(T--){
		cin>>n,memset(tr1,0,sizeof tr1),memset(tr2,0,sizeof tr2);
		for(int i=1;i<=n;i++)cin>>a[i];
		solve();
	}return 0;
}
2024/7/16 08:45
加载中...