求指出代码UB的地方
查看原帖
求指出代码UB的地方
967972
Rindong楼主2024/11/26 22:44

#2 #3 一直过不去,显示WA输出0 下到本地使用 fc 命令对比是无误的。开不开 O2 都过不去

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define MAX_N 200010
const int INF = 1e7;
int arr[MAX_N] = { 0 };
int brr[MAX_N] = { 0 };
// 1 最小下标     2 最大坐标
int dis1[MAX_N] = { 0 }, dis2[MAX_N] = { 0 };
int cnt[MAX_N] = { 0 };
int unique(int n) {
	int ret = 0, las = -1;
	for (int x = 1; x <= n; x++) {
		if (las != brr[x])
			brr[++ret] = brr[x];
		las = brr[x];
	}
	return ret;
}
int len;
inline int get_blo(int i) { return (i - 1) / len + 1; }
struct Query {
	int l, r, id;
	bool operator< (const Query& other) const {
		int bl = get_blo(l), br = get_blo(other.l);
		if (bl != br) return bl < br;
		return r < other.r;
	}
} query[MAX_N];
int ans[MAX_N] = { 0 };
int dis3[MAX_N] = { 0 };
bool vis[MAX_N] = { 0 };
int brute(int l, int r) {
	int ret = 0;
	for (int x = l; x <= r; x++) {
		if (vis[arr[x]]) ret = max(ret, x - dis3[arr[x]]);
		else dis3[arr[x]] = x;
		vis[arr[x]] = true;
	}
	for (int x = l; x <= r; x++) vis[arr[x]] = false;
	return ret;
}
int res = 0;
void add(int x, bool right) {
	int v = arr[x];
	if (cnt[v] == 0) dis1[v] = dis2[v] = x;
	else {
		if (right) {
			dis2[v] = x;
			res = max(res, dis2[v] - dis1[v]);
		}
		else res = max(res, dis2[v] - x);
	}
	cnt[v] ++;
}
int main() {
	int n, m;
	scanf("%d", &n);
	for (int x = 1; x <= n; x++) scanf("%d", arr + x), brr[x] = arr[x];
	sort(brr + 1, brr + 1 + n);
	int k = unique(n);
	len = sqrt(n);
	for (int x = 1; x <= n; x++) {
		int l = 1, r = k, mid;
		while (l < r) {
			mid = l + r >> 1;
			if (brr[mid] >= arr[x]) r = mid;
			else l = mid + 1;
		}
		arr[x] = r;
	}
	scanf("%d", &m);
	for (int x = 1; x <= m; x++) {
		int l, r;
		scanf("%d%d", &l, &r);
		query[x] = { l, r, x };
	}
	sort(query + 1, query + 1 + m);
	int b = 1, q = 1;
	while (true) {
		int las = 0;
		res = 0;
		int rg = min(n, b * len);
		int l = rg + 1, r = rg;
		while (b == get_blo(query[q].l)) {
			int L = query[q].l, R = query[q].r, id = query[q].id;
			if (get_blo(L) == get_blo(R)) {
				ans[id] = brute(L, R);
				q++;
				continue;
			}
			while (r < R) add(++r, true);
			las = res;
			l = rg + 1;
			while (l > L) add(--l, false);
			while (l < rg + 1) {
				cnt[arr[l]] --;
				l++;
			}
			ans[id] = res;
			res = las;
			q++;
		}
		if (q > m) break;
		memset(cnt, 0, sizeof cnt);
		b++;
	}
	for (int x = 1; x <= m; x++) printf("%d\n", ans[x]);
	return 0;
}
2024/11/26 22:44
加载中...