16pts 求调
查看原帖
16pts 求调
381949
Federico2903楼主2024/4/16 19:39
/* #ifdef ONLINE_JUDGE */
/* #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") */
/* #pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt") */
/* #include <immintrin.h> */
/* #include <emmintrin.h> */
/* #endif */
#include <bits/stdc++.h>

#define rep(i, a, b) for(int i = (a), i##end = (b); i <= i##end; i++)
#define _rep(i, a, b) for(int i = (a), i##end = (b); i >= i##end; i--)
#define ec first
#define fb second
#define dl make_pair
#define dk(...) make_tuple(__VA_ARGS__)

using namespace std;

typedef long long ll;
typedef pair <int, int> pii;

int read() {
	int x = 0, f = 1; char c = getchar();
	while (!isdigit(c)) {
		if (c == '-') f = -1;
		c = getchar();
	}
	while (isdigit(c)) {
		x = (x << 3) + (x << 1) + (c ^ 48);
		c = getchar();
	}
	return x * f;
}

template <typename _Tp>
void print(_Tp x) {
	if (x < 0) x = (~x + 1), putchar('-');
	if (x > 9) print(x / 10);
	putchar(x % 10 + '0');
}

const int MAXN = 5e5 + 5;
const int BASE = 17;
const int MOD = 1e9 + 7;
int T, n, pw[MAXN];

namespace seg {

#define ls(x) ((x) << 1)
#define rs(x) ((x) << 1 | 1)
#define mid ((L + R) >> 1)

	int fh[MAXN << 2], rh[MAXN << 2];

	void pushup(int x, int L, int R) {
		fh[x] = (1ll * fh[ls(x)] * pw[R - mid] % MOD + fh[rs(x)]) % MOD;
		rh[x] = (1ll * rh[rs(x)] * pw[mid - L + 1] % MOD + rh[ls(x)]) % MOD;
	}

	void modify(int x, int L, int R, int pos) {
		if (L == R) {
			fh[x] = rh[x] = 1;
			return;
		}
		if (pos <= mid) modify(ls(x), L, mid, pos);
		else modify(rs(x), mid + 1, R, pos);
		pushup(x, L, R);
	}

	int askF(int x, int L, int R, int l, int r) {
		if (l <= L && R <= r) return fh[x];
		int len = 0, resL = 0, resR = 0;
		if (l <= mid) resL = askF(ls(x), L, mid, l, r);
		if (r > mid) len = r - mid, resR = askF(rs(x), mid + 1, R, l, r);
		return (1ll * resL * pw[len] % MOD + resR) % MOD;
	}

	int askR(int x, int L, int R, int l, int r) {
		if (l <= L && R <= r) return rh[x];
		int len = 0, resL = 0, resR = 0;
		if (l <= mid) len = mid - l + 1, resL = askR(ls(x), L, mid, l, r);
		if (r > mid) resR = askR(rs(x), mid + 1, R, l, r);
		return (1ll * resR * pw[len] % MOD + resL) % MOD;
	}
} // namespace seg

int a[MAXN];

void solve() {
	memset(seg::fh, 0, sizeof seg::fh);
	memset(seg::rh, 0, sizeof seg::rh);
	n = read();
	rep (i, 1, n) a[i] = read();
	rep (i, 1, n) {
		seg::modify(1, 1, n, a[i]);
		int len = min(a[i], n - a[i] + 1);
		int resL = seg::askF(1, 1, n, a[i] - len + 1, a[i] + len - 1);
		int resR = seg::askR(1, 1, n, a[i] - len + 1, a[i] + len - 1);
		if (resL != resR) return puts("Y"), void();
	}
	puts("N");
}

signed main() {
	pw[0] = 1;
	rep (i, 1, 5e5) pw[i] = 1ll * pw[i - 1] * BASE % MOD;
	T = read();
	while (T --> 0) solve();
	return 0;
}
2024/4/16 19:39
加载中...