werid advertisement

紫题

2019-01-14 21:16:22

Personal

```cpp #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct w{ int x, yd, yu, c; bool operator < (const w &g) const { return x < g.x; } }q[60010]; struct tree{ int l, r, cnt, len[11]; }ak[240010]; int s[60010], n, m, k, t; inline int val(int x) { return lower_bound(s + 1, s + m + 1, x) - s; } inline int raw(int x) { return s[x]; } void build(int p, int l, int r) { ak[p].l = l, ak[p].r = r, ak[p].cnt = 0; memset(ak[p].len, 0, sizeof(ak[p].len)); if(l == r) return; int mid = (l + r) >> 1; build(p * 2, l, mid), build(p * 2 + 1, mid + 1, r); } void update(int p, int l, int r) { memset(ak[p].len, 0, sizeof(ak[p].len)); for(int i = 1; i <= ak[p].cnt; i++) ak[p].len[i] = raw(r + 1) - raw(l); for(int i = 1; ak[p].cnt + i <= k; i++) ak[p].len[ak[p].cnt + i] += ak[p * 2].len[i] + ak[p * 2 + 1].len[i]; // printf("%d: (%d %d) cnt: %d len: %d\n", p, l, r, ak[p].cnt, ak[p].len[ak[p].cnt]); } void add(int p, int l, int r, int s, int t, int v) { if(l > t || r < s) return; if(l >= s && r <= t) { ak[p].cnt += v; update(p, l, r); return; } int mid = (l + r) >> 1; add(p * 2, l, mid, s, t, v), add(p * 2 + 1, mid + 1, r, s, t, v); update(p, l, r); } void solve(int step) { int a, b, c, d; long long ans = 0; scanf("%d%d", &n, &k); for(int i = 1; i <= n; i++) { scanf("%d%d%d%d", &a, &b, &c, &d); q[2 * i - 1] = (w){a, b, d + 1, 1}, q[2 * i] = (w){c + 1, b, d + 1, -1}; s[2 * i - 1] = b, s[2 * i] = d + 1; } sort(q + 1, q + 2 * n + 1); sort(s + 1, s + 2 * n + 1); m = unique(s + 1, s + 2 * n + 1) - s - 1; build(1, 1, m - 1); for(int i = 1; i <= 2 * n; i++) { // printf("%d (%d,%d), %d----------\n", i, q[i].yd, q[i].yu, q[i].c); if(i > 1 && q[i].x > q[i - 1].x) ans += 1ll * ak[1].len[k] * (q[i].x - q[i - 1].x); add(1, 1, m - 1, val(q[i].yd), val(q[i].yu) - 1, q[i].c); } printf("Case %d: %lld\n", step, ans); } int main() { scanf("%d", &t); for(int i = 1; i <= t; i++) solve(i); return 0; } ```