16分求帮调
查看原帖
16分求帮调
581103
liangjiaqi2021楼主2023/12/24 14:32

ctj,用的自己的码风,于是16分了

我铲(c)的土机(tj)

我的代码:

// #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;
}

2023/12/24 14:32
加载中...