我的代码:
// #include <iostream>
#include <cstdio>
#include <cstring>
#define int long long
// #define abs(x) (((x)>0)?(x):-(x))
#define max(x,y) (((x)>(y))?(x):(y))
#define min(x,y) (((x)<(y))?(x):(y))
#define isdigit(x) ((x)>='0'&&(x)<='9')
using namespace std;
// typedef long long ll;
const int N = 500005.1145141919810; // 哼 哼 哼 啊啊啊啊啊啊啊啊
const int mod = 19280817;
int read() // 每天手搓快读快写 日后就能练就手搓cpu的本领
{
int x = 0, w = 1; char c = getchar();
while (!isdigit(c))
{
if (c == '-')
w = - 1;
c = getchar();
}
while (isdigit(c))
x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x * w;
}
// void write(int x)
// {
// if(x < 0)
// putchar('-'), x = -x;
// if(x > 9)
// write(x / 10);
// putchar(x % 10 + '0');
// }
int hash1[N << 2], hash2[N << 2];
int n, pw[N];
void update(int s, int l, int r, int x)
{
if (l == r && l == x)
{
hash1[s] = hash2[s] = 1;
return;
}
if (l > x || r < x)
return;
int mid = l + r >> 1;
update(s << 1, l, mid, x);
update(s << 1 | 1, mid + 1, r, x);
hash1[s] = (hash1[s << 1] * pw[r - mid] % mod + hash1[s << 1 | 1]) % mod;
hash2[s] = (hash2[s << 1] % mod + hash2[s << 1 | 1] + pw[mid - l + 1]) % mod;
}
int solve1(int s, int l, int r, int beg, int end)
{
if (l > end || r < beg)
return 0;
if (l >= beg && r <= end)
return hash1[s];
int mid = l + r >> 1, ans = 0;
if (mid < beg) return solve1(s << 1 | 1, mid + 1, r, beg, end);
if (mid + 1 > end)
return solve1(s << 1, l, mid, beg, end);
ans = solve1(s << 1, l, mid, beg, end) * pw[min(end, r) - mid] % mod;
ans = (ans + solve1(s << 1 | 1, mid + 1, r, beg, end)) % mod;
return ans;
}
int solve2(int s, int l, int r, int beg, int end)
{
if (l > end || r < beg)
return 0;
if (l >= beg && r <= end)
return hash2[s];
int mid = l + r >> 1, ans = 0;
if (mid < beg) return solve2(s << 1 | 1, mid + 1, r, beg, end);
if (mid + 1 > end)
return solve2(s << 1, l, mid, beg, end);
ans = solve2(s << 1 | 1, mid + 1, r, beg, end) * pw[mid - max(beg, l) + 1] % mod;
ans = (ans + solve2(s << 1, l, mid, beg, end)) % mod;
return ans;
}
signed main()
{
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
// ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // iostream加速
int t = read(); pw[0] = 1;
for (int i = 1; i <= 10000; ++i)
pw[i] = (pw[i - 1] * 2) % mod;
do {
memset(hash1, 0, sizeof hash1);
memset(hash2, 0, sizeof hash2);
n = read(); bool f = true;
for (int i = 1; i <= n; ++i)
{
int x = read();
if (!f)
continue;
int len = min(x - 1, n - x);
if ((solve1(1, 1, n, x - len, x - 1) + mod) % mod != (solve2(1, 1, n, x + 1, x + len) + mod) % mod)
{
f = false; continue;
}
update(1, 1, n, x);
}
if (f)
putchar('N'), putchar('\n');
else
putchar('Y'), putchar('\n');
} while (--t);
return 0;
}