瞪了半天了,球球了/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;
}