求助线段树维护哈希;和题解对拍了1h没有拍出问题!
查看原帖
求助线段树维护哈希;和题解对拍了1h没有拍出问题!
468657
lsj2009Isj2OO9楼主2023/7/16 10:45

rt.

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define int long long
#define PII pair<int,int>
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=1e6+5,base=13,MOD=1e9+7;
int a[N],p[N],T,n;
struct node {
	int hash1,hash2,l,r;
}; node tree[N<<2];
#define ls(k) (k<<1)
#define rs(k) (k<<1|1)
void push_up(int k) {
	int len_l=tree[ls(k)].r-tree[ls(k)].l+1,len_r=tree[rs(k)].r-tree[rs(k)].l+1;
	tree[k].hash1=(tree[ls(k)].hash1*p[len_r]%MOD+tree[rs(k)].hash1)%MOD;
	tree[k].hash2=(tree[rs(k)].hash2*p[len_l]%MOD+tree[ls(k)].hash2)%MOD;
}
void build(int k,int l,int r) {
	tree[k]={0,0,l,r};
	if(l==r)
		return;
	int mid=(l+r)>>1;
	build(ls(k),l,mid);
	build(rs(k),mid+1,r);
	push_up(k);
}
void update(int k,int qx,int val) {
	if(tree[k].l==tree[k].r) {
		tree[k].hash1=tree[k].hash2+=val; return;
	}
	if(qx<=tree[ls(k)].r)
		update(ls(k),qx,val);
	if(qx>=tree[rs(k)].l)
		update(rs(k),qx,val);
	push_up(k);
}
int query1(int k,int l,int r) {
	if(l>r) return 0;
	if(l<=tree[k].l&&tree[k].r<=r)
		return tree[k].hash1;
	if(r<=tree[ls(k)].r)
		return query1(ls(k),l,r);
	else if(l>=tree[rs(k)].l)
		return query1(rs(k),l,r);
	else
		return (query1(ls(k),l,r)*p[r-tree[rs(k)].l+1]%MOD+query1(rs(k),l,r))%MOD;
}
int query2(int k,int l,int r) {
	if(l>r) return 0;
	if(l<=tree[k].l&&tree[k].r<=r)
		return tree[k].hash2;
	if(r<=tree[ls(k)].r)
		return query2(ls(k),l,r);
	else if(l>=tree[rs(k)].l)
		return query2(rs(k),l,r);
	else
		return (query2(rs(k),l,r)*p[tree[ls(k)].r-l+1]%MOD+query2(ls(k),l,r))%MOD;
}
void init() {
	p[0]=1;
	rep(i,1,N-1)
		p[i]=p[i-1]*base%MOD;
}
signed main() {
	scanf("%lld",&T); init();
	while(T--) {
		cl(tree,0);
		scanf("%lld",&n);
		build(1,1,n);
		bool flag=false;
		rep(i,1,n) {
			scanf("%lld",&a[i]);
			int len=min(n-a[i],a[i]-1);
			if(query1(1,a[i]-len,a[i]-1)!=query2(1,a[i]+1,a[i]+len))
				flag=true;
			update(1,a[i],1);
		}
		puts(flag? "Y":"N");
	}
	return 0;
}

求 hack 数据。

2023/7/16 10:45
加载中...