神秘RE求调
查看原帖
神秘RE求调
1180996
HenghengMoi楼主2025/1/8 21:48

rt,RE0pts

#include <bits/stdc++.h>
#define PII pair<int, int>
#define PIII pair<int, PII >
using namespace std;

int n, m, A, B, C, len, p[500005], cnt[500005];
int s[500005], sum[500005], ans[500005];
PII pii[500005];
PIII a[500005], b[500005];
int tr[500005];

bool cmp(int i, int j) {
	return pii[i].first < pii[j].first || 
	(pii[i].first == pii[j].first && pii[i].second < pii[j].second);
}

int lowbit(int x) { return x & -x; }

int init() { for (int i = 1; i <= m; i++) tr[i] = 0; }

void add(int p, int k) {
	while (p <= m) {
		tr[p] += k;
		p += lowbit(p);
	}
}

int query(int p) {
	int ret = 0;
	while (p) {
		ret += tr[p];
		p -= lowbit(p);
	}
	return ret;
}

void f(int l, int r) {
	if (l == r) return;
	int mid = (l + r) >> 1;
	f(l, mid);
	f(mid + 1, r);
	init();
	for (int i = l, j = mid + 1; j <= r; j++) {
		while (i <= mid && pii[p[i]].first <= pii[p[j]].first) {
			add(pii[p[i]].second, cnt[p[i]]);
			i++;
		}
		sum[p[j]] += query(pii[p[j]].second);
	}
	int pl = l, pr = mid + 1, len = 0;
	while (pl <= mid && pr <= r) {
		if (cmp(p[pl], p[pr])) {
			s[++len] = p[pl];
			pl++;
		}
		else {
			s[++len] = p[pr];
			pr++;
		}
	}
	for (int i = pl; i <= mid; i++) s[++len] = p[i];
	for (int i = pr; i <= r; i++) s[++len] = p[i];
	for (int i = 1; i <= len; i++) p[l + i - 1] = s[i], s[i] = 0;
}

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
    	cin >> A >> B >> C;
    	b[i] = a[i] = make_pair(A, make_pair(B, C));
    }
    sort(a + 1, a + n + 1);
    len = unique(a + 1, a + n + 1) - a - 1;
    for (int i = 1; i <= n; i++) cnt[lower_bound(a + 1, a + len + 1, b[i]) - a]++;
    for (int i = 1; i <= len; i++) {
    	pii[i] = make_pair(a[i].second.first, a[i].second.second);
    	sum[i] = cnt[i];
    	p[i] = i;
    }
    f(1, len);
    for (int i = 1; i <= len; i++) ans[sum[i]] += cnt[i];
    for (int i = 1; i <= n; i++) cout << ans[i] << '\n';
    return 0;
}
2025/1/8 21:48
加载中...