求调,#1~5 RE #7~26 WA
查看原帖
求调,#1~5 RE #7~26 WA
729386
_Fancy_楼主2025/7/18 19:59
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5, mod = 998244353;
int n, t, a[N], tim[N];
struct node {
	int l, r, sum, tag;
} tr[2][N << 2];
void pushup(int x, int u) {
	tr[x][u].sum = (tr[x][u << 1].sum * tim[tr[x][u << 1 | 1].r - tr[x][u << 1 | 1].l + 1] % mod + tr[x][u << 1 | 1].sum) % mod;
}
void build(int x, int u, int l, int r) {
	tr[x][u] = {l, r, 0};
	if(l == r) return;
	int mid = l + r >> 1;
	build(x, u << 1, l, mid);
	build(x, u << 1 | 1, mid + 1, r);
}
void add(int x, int u, int tt, int k) {
	if(tr[x][u].l == tr[x][u].r) {
		tr[x][u].sum = k;
		return;
	}
	int mid = tr[x][u].l + tr[x][u].r >> 1;
	if(tt <= mid) add(x, u << 1, tt, k);
	else add(x, u << 1 | 1, tt, k);
	pushup(x, u);
}
int query(int x, int u, int l, int r) {
	if(l <= tr[x][u].l && tr[x][u].r <= r) return (tim[r - tr[x][u].r] * tr[x][u].sum) % mod;
	int mid = tr[x][u].l + tr[x][u].r >> 1, ans = 0;
	if(l <= mid) ans += query(x, u << 1, l, r), ans %= mod;
	if(r > mid) ans += query(x, u << 1 | 1, l, r), ans %= mod;
	return ans % mod;
}
signed main() {
	cin >> t;
	tim[0] = 1;
	for(int i = 1; i <= 500000; i++) tim[i] = tim[i - 1] * 2 % mod;
	while(t--) {
		cin >> n;
		for(int i = 1; i <= n; i++) cin >> a[i];
		build(1, 1, 1, n);
		build(2, 1, 1, n);
		add(1, 1, a[1], 1);
		add(2, 1, n + 1 - a[1], 1);
		add(2, 1, n + 1 - a[2], 1);
		bool flag = 0;
		for(int i = 2; i < n; i++) {
			int tmp = min(a[i] - 1, n - a[i]);
			if(tmp != 0 && query(1, 1, a[i] - tmp, a[i] - 1) != query(2, 1, n - a[i] + 1 - tmp, n - a[i])) {
				flag = 1;
				break;
			}
			add(1, 1, a[i], 1);
			add(2, 1, n + 1 - a[i + 1], 1);
		}
		if(flag) cout << "Y\n";
		else cout << "N\n";
	}
	return 0;
}
2025/7/18 19:59
加载中...