社区讨论

线段树+字符串哈希,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 条回复,欢迎继续交流。

正在加载回复...