全RE了, 至今未解
查看原帖
全RE了, 至今未解
541568
Linghua_dog楼主2023/7/19 09:35
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>

#define int long long

using namespace std;

const int N = 1e6 + 10, b = 2333, mod = 1145141919810;

struct tree
{
	int l, r;
	int hash, siz;
}tr[4 * N], trp[4 * N];
int base[N], a[N];
int n;

void pushup(tree &u, tree &l, tree &r)
{
	u.siz = u.r - u.l + 1;
	u.hash = (l.hash * base[r.siz] % mod + r.hash) % mod;
}

void pushup(int u, tree tr[])
{
	pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}

void build(int u, int l, int r, tree tr[])
{
	tr[u] = {l, r};
	if(l == r) 
	{
		tr[u].hash = 1;
		tr[u].siz = 1;
		return ;
	}
	int mid = l + r >> 1;
	build(u << 1, l, mid, tr), build(u << 1 | 1, mid + 1, r, tr);
	pushup(u, tr);
}

void modify(int u, int x, int v, tree tr[])
{
	if(tr[u].l == tr[u].r) tr[u].hash = v;
	else
	{
		int mid = tr[u].l + tr[u].r >> 1;
		if(x <= mid) modify(u << 1, x, v, tr);
		if(x > mid) modify(u << 1 | 1, x, v, tr);
	}
	pushup(u, tr);
}

tree query(int u, int l, int r, tree tr[])
{
	if(tr[u].l >= l && tr[u].r <= r) return tr[u];
	
	int mid = tr[u].l + tr[u].r >> 1;
	if(r <= mid) return query(u << 1, l, r, tr);
	if(l > mid) return query(u << 1 | 1, l, r, tr);
	
	tree ans, left, right;
	left = query(u << 1, l, r, tr);
	right = query(u << 1 | 1, l, r, tr);
	pushup(ans, left, right);
	return ans;
}

bool check(int l, int r)
{
	int ha = query(1, l, r, tr).hash;
	int hb = query(1, n - r + 1, n - l + 1, trp).hash;
	return ha != hb;
}

bool solve(int mid)
{	
	int len = min(n - mid, mid - 1);
	return check(mid - len, mid + len);
}

signed main()
{
	int T;
	scanf("%lld", &T);
	
	base[0] = 1;
	for(int i = 1; i < 5e5; i++) base[i] = base[i - 1] * b % mod;
	
	while(T--)
	{
		scanf("%lld", &n);
		for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
		
		build(1, 1, n, tr);
		build(1, 1, n, trp);
		
		bool f = false;
		for(int i = 1; i <= n; i++)
		{
			if(a[i] == 1 || a[i] == n)
			{
				modify(1, a[i], 0, tr);
				modify(1, n - a[i] + 1, 0, trp);
				continue;
			} 
			if(solve(a[i]))
			{
				f = true;
				break;
			}
			modify(1, a[i], 0, tr);
			modify(1, n - a[i] + 1, 0, trp);
		}
		
		if(f)puts("Y");
		else puts("N");
	}
}
2023/7/19 09:35
加载中...