数据过水?
查看原帖
数据过水?
670046
___w楼主2023/12/20 13:56

rt,O(nlog⁡2n)O(n\log^2 n) 的代码被放过了,record。

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define ll long long
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;

inline int read() {
	int x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c > '9') f = c == '-' ? -1 : f, c = getchar();
	while (c >= '0' && c <= '9') x = (x<<3)+(x<<1)+(c^48), c = getchar();
	return x*f;
}

inline void write(int x) {
	if (x < 0) x = -x, putchar('-');
	if (x > 9) write(x/10);
	putchar('0'+x%10);
}

const int N = 2e6+5;
struct que { int op, t, x, y; } a[N];
int q, n, idx, b[N];

struct bit {
	int sum, c[N];
	inline void add(int x, int k) { for (; x <= n; x += x&-x) c[x] += k; sum += k; }
	inline int ask_pre(int x) { int res = 0; for (; x; x -= x&-x) res += c[x]; return res; }
	inline int ask_suf(int x) { return sum-ask_pre(x-1); }
} t[2];

int main() {
	q = read();
	for (int i = 1; i <= q; ++i) {
		a[i].op = read(), a[i].t = read();
		if (a[i].op == 1) a[i].x = read(), a[i].y = read(), b[++idx] = a[i].x;
	}
	sort(b+1, b+idx+1);
	n = unique(b+1, b+idx+1)-b-1;
	for (int i = 1; i <= q; ++i) if (a[i].x) a[i].x = lower_bound(b+1, b+n+1, a[i].x)-b;
	for (int i = 1; i <= q; ++i) {
		if (a[i].op == 1) t[a[i].t].add(a[i].x, a[i].y);
		else t[a[a[i].t].t].add(a[a[i].t].x, -a[a[i].t].y);
		int l = 1, r = n, p;
		while (l < r) {
			int mid = l+r+1>>1;
			if (t[0].ask_pre(mid) < t[1].ask_suf(mid)) l = mid;
			else r = mid-1;
		}
		p = l, l = p+1, r = n;
		while (l < r) {
			int mid = l+r+1>>1;
			if (t[1].ask_suf(p+1) <= t[1].ask_suf(mid)) l = mid;
			else r = mid-1;
		}
		int m1 = min(t[0].ask_pre(l), t[1].ask_suf(l)), m2 = min(t[0].ask_pre(p), t[1].ask_suf(p));
		if (!max(m1, m2)) puts("Peace");
		else write(b[m1 >= m2 ? l : p]), space, write(2*max(m1, m2)), enter;
	}
	return 0;
}
2023/12/20 13:56
加载中...