CDQ 分治
CDQ 分治
还没写。。。
#include <bits/stdc++.h>
#define il inline
using namespace std;
bool Beg;
namespace Zctf1088 {
namespace IO {
const int bufsz = 1 << 20;
char ibuf[bufsz], *p1 = ibuf, *p2 = ibuf;
#define getchar() (p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, bufsz, stdin), p1 == p2) ? EOF : *p1++)
il int read() {
int x = 0; char ch = getchar(); bool t = 0;
while (ch < '0' || ch > '9') {t ^= ch == '-'; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
return t ? -x : x;
}
char obuf[bufsz], *p3 = obuf, stk[50];
#define flush() (fwrite(obuf, 1, p3 - obuf, stdout), p3 = obuf)
#define putchar(ch) (p3 == obuf + bufsz && flush(), *p3++ = (ch))
il void write(int x, bool t = 0) {
int top = 0;
x < 0 ? putchar('-'), x = -x : 0;
do {stk[++top] = x % 10 | 48; x /= 10;} while(x);
while (top) putchar(stk[top--]);
t ? putchar(' ') : putchar('\n');
}
il void wrt() {putchar('\n');}
struct FL {
~FL() {flush();}
} fl;
}
using IO::read; using IO::write; using IO::wrt;
const int N = 2e5 + 10;
int n, kk;
struct node {
int x, y, z, cnt, num;
il bool operator < (const node & c) const {
return x != c.x ? x < c.x : (y != c.y ? y < c.y : z < c.z);
}
} a[N], b[N];
namespace BIT {
int c[N];
il void update(int x, int v) {
for (int i = x; i <= kk; i += (i & -i)) {
c[i] += v;
}
}
il int query(int x) {
int res = 0;
for (int i = x; i; i -= (i & -i)) {
res += c[i];
}
return res;
}
}
il void cdq(int l, int r) {
if (l == r) return;
int mid = (l + r) >> 1;
cdq(l, mid), cdq(mid + 1, r);
int pl = l, pr = mid + 1;
for (int i = l; i <= r; i++) {
if (pr > r || (pl <= mid && a[pl].y <= a[pr].y)) {
BIT::update(a[pl].z, a[pl].cnt);
b[i] = a[pl++];
} else {
a[pr].num += BIT::query(a[pr].z);
b[i] = a[pr++];
}
}
for (int i = l; i <= mid; i++) BIT::update(a[i].z, -a[i].cnt);
for (int i = l; i <= r; i++) a[i] = b[i];
}
int t[N];
signed main() {
n = read(), kk = read();
for (int i = 1; i <= n; i++) {
int x = read(), y = read(), z = read();
a[i] = {x, y, z};
}
sort(a + 1, a + 1 + n);
int m = 0;
for (int i = 1, j = 0; i <= n; i++) {
if (a[i].x == a[j].x && a[i].y == a[j].y && a[i].z == a[j].z) {
a[j].cnt++;
} else {
a[++j] = a[i];
a[j].cnt = 1;
m++;
}
}
cdq(1, m);
for (int i = 1; i <= m; i++) {
t[a[i].num + a[i].cnt - 1] += a[i].cnt;
}
for (int i = 0; i < n; i++) write(t[i]);
return 0;
}}
bool End;
il void Usd() {cerr << "\nUse: " << (&Beg - &End) / 1024.0 / 1024.0 << "MB " << (double)clock() * 1000.0 / CLOCKS_PER_SEC << "ms\n";}
signed main() {
Zctf1088::main();
Usd();
return 0;
}

浙公网安备 33010602011771号