我有UB吗?
  • 板块灌水区
  • 楼主cirnovsky
  • 当前回复38
  • 已保存回复38
  • 发布时间2020/6/6 08:33
  • 上次更新2023/11/7 01:09:30
查看原帖
我有UB吗?
161849
cirnovsky楼主2020/6/6 08:33

Dynamic Rankings,吐血调出样例后提交0pts,然后数据下下来过后fc对了没问题,然后交IDE跑没输出。

是我代码有UB吗,编译选项我已经尽量开严了,但是还是找不出来,求助……感谢……

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>

using namespace std;

char buf[1 << 21], *p1 = buf, *p2 = buf;
#ifndef ONLINE_JUDGE
#define gc() getchar()
#else
#define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
#endif
#define is() (ch >= '0' && ch <= '9')

template < typename Type >
void read(Type& a) {
	a = 0; char ch; bool f = 0;
	while (!(ch = gc(), is())) if (ch == '-') f = 1;
	while (is()) a = (a << 3) + (a << 1) + (ch ^ '0'), ch = gc();
	a = (f ? -a : a);
}

template < typename Type, typename... Args >
void read(Type& t, Args&... args) {
	read(t), read(args...);
}

const int N = 1e5 + 5, INF = 1e9;
int n, m, t, p, a[N], bit[N], ans[N];
struct AskSet {
	int type, pos, fr, ba;
	int val, flags, rnk, id;
	// type: -1->擦除, 0->赋值, 1->询问
	// pos: 如果为修改操作,修改的下标
	// fr/ba: 如果为查询,查询区间的上下界
	// val: 如果为修改操作,修改后的值
	// flags: 如果是修改操作,拆成擦除和赋值两个操作的标志
	// rnk: 如果为查询操作,查询的排名
	// id: 第几个查询操作
} q[N * 3], lq[N * 3], rq[N * 3];

AskSet make_mask(int type, int pos, int fr, int ba, int val, int flags, int rnk, int id) {
	AskSet res;
	res.type = type, res.pos = pos, res.fr = fr, res.ba = ba;
	res.val = val, res.flags = flags, res.rnk = rnk, res.id = id;
	return res;
}

void modify(int pos, int value) {
	for (; pos <= n; pos += pos & -pos)
		bit[pos] += value;
}

int queryf(int pos) {
	int res = 0;
	for (; pos; pos -= pos & -pos)
		res += bit[pos];
	return res;
}

void solve(int lval, int rval, int fr, int ba) {
	if (lval > rval || fr > ba) return ;
	if (lval == rval) {
		for (int i = fr; i <= ba; ++i)
			if (q[i].type == 1) ans[q[i].id] = lval;
		return ;
	}
	int mid = (lval + rval) >> 1;
	int lt = 0, rt = 0;
	for (int i = fr; i <= ba; ++i) {
		if (q[i].type == 0) {
			if (q[i].val <= mid) modify(q[i].pos, q[i].flags), lq[++lt] = q[i];
			else rq[++rt] = q[i];
		} else {
			int cnt = queryf(q[i].ba) - queryf(q[i].fr - 1);
			if (q[i].rnk <= cnt) lq[++lt] = q[i];
			else q[i].rnk -= cnt, rq[++rt] = q[i];
		}
	}
	for (int i = ba; i >= fr; --i)
		if (q[i].type == 0 && q[i].val <= mid)
			modify(q[i].pos, -q[i].flags);
	for (int i = 1; i <= lt; ++i) q[fr + i - 1] = lq[i];
	for (int i = 1; i <= rt; ++i) q[fr + i + lt - 1] = rq[i];
	solve(lval, mid, fr, fr + lt - 1);
	solve(mid + 1, rval, fr + lt, ba);
}

signed main() {
	read(n, m);
	for (int i = 1; i <= n; ++i) {
		read(a[i]);
		q[++t] = make_mask(0, i, 0, 0, a[i], 1, 0, 0);
	}
	for (int i = 1, fr, ba, rnk, pos, val; i <= m; ++i) {
		char str[5];
		scanf("%s", str);
		if (*str == 'Q') {
			read(fr, ba, rnk);
			q[++t] = make_mask(1, 0, fr, ba, 0, 0, rnk, ++p);
		} else {
			read(pos, val);
			q[++t] = make_mask(0, pos, 0, 0, a[pos], -1, 0, 0);
			q[++t] = make_mask(0, pos, 0, 0, val, 1, 0, 0);
			a[pos] = val;
		}
	}
	solve(0, INF, 1, t);
	for (int i = 1; i <= p; ++i) printf("%d\n", ans[i]);
	return 0;
}
2020/6/6 08:33
加载中...