WA70 求助
查看原帖
WA70 求助
1198768
qazsedcrfvgyhnujijn楼主2024/5/28 21:04

对拍找不出错:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5;

int n, k, m, ans[N + 5];
template <typename T>
struct BIT {
	T a[(N << 1) + 5];
	#define lowbit(x) ((x) & -x)
	void add(int pos, T val) {
		for (int i = pos; i <= k; i += lowbit(i)) a[i] += val;
	}
	T query(int pos) {
		T res = 0;
		for (int i = pos; i > 0; i -= lowbit(i)) res += a[i];
		return res;
	}
};

struct Elem {
	int a, b, c;
	int cnt, res;
	bool operator != (const Elem& other) const {
		return a != other.a || b != other.b || c != other.c;
	}
};
bool cmp1(Elem a, Elem b) {
	if (a.a != b.a) return a.a < b.a;
	if (a.b != b.b) return a.b < b.b;
	return a.c < b.c;
}
bool cmp2(Elem a, Elem b) {
	if (a.b != b.b) return a.b < b.b;
	return a.c < b.c;
}

Elem a[N], b[N];
BIT <int> bit;

void CDQ(int l, int r) {
	if (l == r) return;
	int mid = (l + r) >> 1;
	CDQ(l, mid);
	CDQ(mid + 1, r);
	sort(b + l, b + mid + 1, cmp2);
	sort(b + mid + 1, b + r + 1, cmp2);
	int i = l, j = mid + 1;
	for (; j <= r; j++) {
		for (; i <= mid && b[i].b <= b[j].b; i++)
			bit.add(b[i].c, b[i].cnt);
		b[j].res += bit.query(b[j].c);
	}
	for (int k = l; k < i; k++) bit.add(b[k].c, -b[k].cnt);
}

main() {
	scanf("%d%d", &n, &k);
	for (int i = 1; i <= n; i++)
		scanf("%d%d%d", &a[i].a, &a[i].b, &a[i].c);
	sort(a + 1, a + n + 1, cmp1);
	for (int i = 1, t = 0; i <= n; i++) {
		++t;
		if (a[i] != a[i + 1])
			++m, b[m] = a[i], b[m].cnt = t, b[m].res = 0, t = 0;
	}
	CDQ(1, m);
	for (int i = 1; i <= m; i++)
		ans[b[i].res + b[i].cnt - 1] += b[i].cnt;
	for (int i = 0; i < n; i++)
		printf("%d\n", ans[i]);
}
2024/5/28 21:04
加载中...