求助RE on 9, 90pts
查看原帖
求助RE on 9, 90pts
648953
1Stone楼主2023/2/20 18:43
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define Rg register ll
ll N, K, same[1000005], f[1000005];
struct Node {
	ll a, b, c, idx;
	bool op;
	bool operator == (Node &o) {
		return a == o.a && b == o.b && c == o.c;
	}
}A[1000005], B[1000005], C[1000005];
bool operator <= (Node a, Node b) {
	if(a.b < b.b) return true;
	else if(a.b > b.b) return false;
    if(a.c <= b.c) return true;
    else return false;
}
bool cmp(Node x, Node o) {
	if(x.a < o.a) return true;
	else if(x.a > o.a) return false;
	if(x.b < o.b) return true;
	else if(x.b > o.b) return false;
	if(x.c <= o.c) return true;
	else return false;
}
void cdq2(ll l, ll r) {
	if(l == r) return;
	ll mid = (l + r) >> 1;
	cdq2(l, mid); cdq2(mid + 1, r);
	ll p1 = l, p2 = mid + 1, tot = l, tp = 0;
    if(B[p1].op == 0) tp += same[B[p1].idx];
    while(p2 <= r and p1 <= mid) {
        while(p2 <= r and B[p2].c < B[p1].c) {
        	++p2;
        }
        while(p2 <= r and p1 + 1 <= mid and B[p1 + 1].c <= B[p2].c) {
        	++p1;
        	if(B[p1].op == 0) tp += same[B[p1].idx];
        }
        if(p2 > r) continue;
        if(B[p2].op == 1) f[B[p2].idx] += tp;
        ++p2;
    }
    p1 = l; p2 = mid + 1;
    while(p1 <= mid and p2 <= r) {
    	if(B[p1].c <= B[p2].c) {
    		C[tot++] = B[p1++];
    	}
    	else {
    		C[tot++] = B[p2++];
    	}
    }
    while(p1 <= mid) C[tot++] = B[p1++];
    while(p2 <= r) C[tot++] = B[p2++];
    
    for(Rg i = l; i <= r; ++i) B[i] = C[i];
	return;
}
void cdq1(ll l, ll r) {
	if(l == r) return;
	ll mid = (l + r) >> 1;
	cdq1(l, mid); cdq1(mid + 1, r);
	for(Rg i = l; i <= mid; ++i) A[i].op = 0;
	for(Rg i = mid + 1; i <= r; ++i) A[i].op = 1;
	ll tot = l, p1 = l, p2 = mid + 1;
	while(p1 <= mid && p2 <= r) {
		if(A[p1] <= A[p2]) {
			B[tot++] = A[p1++];
		}else {
			B[tot++] = A[p2++];
		}
	}
	while(p1 <= mid) {
		B[tot++] = A[p1++];
	}
	while(p2 <= r) {
		B[tot++] = A[p2++];
	}
	for(Rg i = l; i <= r; ++i) A[i] = B[i];
	cdq2(l, r);
	return;
}
ll cnt = 0, Sum[1000005], T;
int main() {
	cin >> N >> K;
	for(Rg i = 1; i <= N; ++i) {
		cin >> A[i].a >> A[i].b >> A[i].c;
	}
	sort(A + 1, A + N + 1, cmp);
	for(Rg i = 1; i <= N; ++i) {
		ll j = i;
		C[++cnt] = A[i]; same[cnt] = 1;
		while(j + 1 <= N and A[j + 1] == A[i]) same[cnt]++, ++j;
		i = j;
	}
	T = N;
	N = cnt;
	for(Rg i = 1; i <= N; ++i) A[i] = C[i], A[i].idx = i;
	cdq1(1, N);
	for(Rg i = 1; i <= N; ++i) f[i] += same[i] - 1;
	
	for(Rg i = 1; i <= N; ++i) {
		Sum[f[i]] += same[i];
	}
	for(Rg i = 0; i < T; ++i) cout << Sum[i] << "\n";
	
	
	
	
	
	
	
	
	return 0;
}
2023/2/20 18:43
加载中...