求调求调求调
查看原帖
求调求调求调
519384
Link_Cut_Y楼主2023/12/30 15:10

瞪了半天了,球球了/kk

h1 是后缀哈希,h2 是前缀哈希。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <bitset>
#include <cmath>
#include <set>
#include <map>
#define int long long
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define rop(i, a, b) for (int i = (a); i < (b); i ++ )
#define dep(i, a, b) for (int i = (a); i >= (b); i -- )
#define dop(i, a, b) for (int i = (a); i > (b); i -- )

#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define D(x) (cerr << #x << " = " << x << '\n')
#define all(x) x.begin(), x.end()
#define lowbit(x) (x & -x)
#define pb push_back
#define gc getchar
#define pc putchar
#define db double
#define y second
#define x first

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
const int mod = 998244353;

void read() { return; }
template <typename T, typename ...T2>
void read(T &s, T2 &...oth) {
	s = 0; char ch = gc(); bool f = 0;
	for (; ch < '0' or ch > '9'; ch = gc()) if (ch == '-') f = 1;
	for (; ch >= '0' and ch <= '9'; ch = gc()) s = (s << 1) + (s << 3) + (ch ^ 48);
	s = f ? -s : s; read(oth...); return;
}
void write(char ch) { return; }
template <typename T, typename ...T2>
void write(char ch, T s, T2 ...oth) {
	if (!s) { pc('0'); pc(ch); write(ch, oth...); return; }
	int stk[100], top = 0;
	if (s < 0) pc('-'), s = ~s + 1;
	while (s) stk[ ++ top] = s % 10, s /= 10;
	do pc(stk[top -- ] + (1 << 4) + (1 << 5)); while (top);
	pc(ch); write(ch, oth...); return;
}

const int N = 500010;
const ULL B = 23333;
ULL p[N]; 
int n, T, a[N], len; 
struct node {
	int l, r;
	ULL h1, h2;
	int len() { return r - l + 1; }
}tr[N << 2];
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid (tr[u].l + tr[u].r >> 1)
void pushup(int u) {
	tr[u].h1 = tr[rs].h1 + tr[ls].h1 * p[tr[rs].len()];
	tr[u].h2 = tr[ls].h2 + tr[rs].h2 * p[tr[ls].len()];
}
void build(int u, int l, int r) {
	tr[u] = {l, r}; if (l == r) return;
	build(ls, l, mid), build(rs, mid + 1, r);
}
void insert(int u, int x) {
	if (tr[u].l == tr[u].r) return void(tr[u].h1 = tr[u].h2 = 1ull);
	insert(x <= mid ? ls : rs, x); pushup(u);
}
ULL query1(int u, int l, int r) {
	if (tr[u].l >= l and tr[u].r <= r) { len += tr[u].len(); return tr[u].h1; }
	ULL s = 0ull; if (r > mid) s = query1(rs, l, r);
	if (l <= mid) s = s + p[len] * query1(ls, l, r); return s;
}
ULL query2(int u, int l, int r) {
	if (tr[u].l >= l and tr[u].r <= r) { len += tr[u].len(); return tr[u].h2; }
	ULL s = 0ull; if (l <= mid) s = query2(ls, l, r);
	if (r > mid) s = s + p[len] * query2(rs, l, r); return s;
}
signed main() {
	read(T);
	while (T -- ) {
		read(n);
		rep(i, 1, n) read(a[i]);
		p[0] = 1; rep(i, 1, n) p[i] = p[i - 1] * B;
		build(1, 1, n); bool flg = 0;
		rep(i, 1, n) {
			insert(1, a[i]);
			int l = min(n - a[i], a[i] - 1);
			if (l <= 0) continue;
			len = 0; ULL h1 = query1(1, a[i] - l, a[i] - 1);
			len = 0; ULL h2 = query2(1, a[i] + 1, a[i] + l);
			if (h1 != h2) { flg = 1; break; }
		} pc(flg ? 'Y' : 'N'); pc('\n');
	} return 0;
}
2023/12/30 15:10
加载中...