社区讨论
线段树+字符串哈希,16分WA求助
题目总版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo26lzka
- 此快照首次捕获于
- 2023/10/23 08:50 2 年前
- 此快照最后确认于
- 2023/11/03 09:06 2 年前
C
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
const int N=550000;
int bt[N<<2][3],p[N],nx,t,n,a[N];
int ans[3]={0,0};
inline int read(){
int z=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
z=(z<<1)+(z<<3)+(c^48);
c=getchar();
}
return z*f;
}
int minn(int a,int b){
return a<b?a:b;
}
void update(int o,int l,int r){
int mid=l+r>>1;
bt[o][0]=(bt[o<<1|1][0]+bt[o<<1][0]*p[r-mid]%mod)%mod;
bt[o][1]=(bt[o<<1][1]+bt[o<<1|1][1]*p[mid-l+1]%mod)%mod;
}
void add(int o,int l,int r,int x){
if(l==r){
bt[o][1]=bt[o][0]=1;
return;
}
int mid=l+r>>1;
if(mid>=x)add(o<<1,l,mid,x);
else add(o<<1|1,mid+1,r,x);
update(o,l,r);
}
void query(int o,int l,int r,int lx,int rx,int k){
if(l>=lx&&r<=rx){
ans[k]=(ans[k]+bt[o][k]*p[nx]%mod)%mod;
nx+=r-l+1;
return;
}
int mid=l+r>>1;
if(mid>=lx)query(o<<1,l,mid,lx,rx,k);
if(mid<rx)query(o<<1|1,mid+1,r,lx,rx,k);
}
signed main(){
t=read();
p[0]=1;
for(int i=1; i<=540000; i++)p[i]=(p[i-1]*131)%mod;
for(int ii=1; ii<=t; ii++){
n=read();
memset(bt,0,sizeof bt);
for(int i=1; i<=n; i++)a[i]=read();
bool flag=0;
for(int i=1; i<=n; i++){
add(1,1,n,a[i]);
int len=minn(n-a[i]+1,a[i]);
ans[0]=ans[1]=nx=0;
query(1,1,n,a[i]-len+1,a[i]+len-1,0);
nx=0;
query(1,1,n,a[i]-len+1,a[i]+len-1,1);
if(ans[1]!=ans[0]){
flag=1;
break;
}
}
if(flag)printf("Y\n");
else printf("N\n");
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...