首页 > 代码库 > BZOJ3262 陌上花开

BZOJ3262 陌上花开

前人之述备矣、、、

树套树即BIT套treap 和 CQD分治 + BIT的方法都有了

于是就做好了233

 

 1 /************************************************************** 2     Problem: 3262 3     User: rausen 4     Language: C++ 5     Result: Accepted 6     Time:1356 ms 7     Memory:5888 kb 8 ****************************************************************/ 9  10 #include <cstdio>11 #include <algorithm>12  13 #define lowbit(x) x & -x14 using namespace std;15 const int N = 100005;16  17 struct data {18     int a, b, c, s, ans;19 }a[N], p[N];20 inline bool sort1_cmp (const data &a, const data &b) {21     return a.a == b.a ? (a.b == b.b ? a.c < b.c : a.b < b.b) : a.a < b.a;22 }23 inline bool operator < (const data &a, const data &b) {24     return a.b == b.b ? a.c < b.c : a.b < b.b;25 }26 inline bool operator == (const data &a, const data &b) {27     return a.a == b.a && a.b == b.b && a.c == b.c;28 }29 inline bool operator != (const data &a, const data &b) {30     return !(a == b);31 }32  33 int tot, n, m, BIT[N << 1], ans[N];34  35 inline int read() {36     int x = 0;37     char ch = getchar();38     while (ch < 0 || 9 < ch)39         ch = getchar();40     while (0 <= ch && ch <= 9) {41         x = x * 10 + ch - 0;42         ch = getchar();43     }44     return x;45 }46  47 inline void update(int x, int del) {48     while (x <= m)49         BIT[x] += del, x += lowbit(x);50 }51  52 inline int query(int x) {53     int res = 0;54     while (x)55         res += BIT[x], x -= lowbit(x);56     return res;57 }58  59 void work(int l, int r) {60     if (l == r) return;61     int mid = l + r >> 1, i, j;62     work(l, mid), work(mid + 1, r);63     sort(p + l, p + mid + 1), sort(p + mid + 1, p + r + 1);64     for (i = l, j = mid + 1; j <= r; ++j) {65         for (; i <= mid && p[i].b <= p[j].b; ++i)66             update(p[i].c, p[i].s);67         p[j].ans += query(p[j].c);68     }69     for (j = l; j < i; ++j)70         update(p[j].c, -p[j].s);71 }72  73 int main() {74     int i, cnt;75     tot = read(), m = read();76     for (i = 1; i <= tot; ++i)77         a[i].a = read(), a[i].b = read(), a[i].c = read();78     sort(a + 1, a + tot + 1, sort1_cmp);79     for (cnt = 1, i = 1; i <= tot; ++i, ++cnt)80         if (a[i] != a[i + 1]) {81             p[++n] = a[i];82             p[n].s = cnt;83             cnt = 0;84         }85     work(1, n);86     for (i = 1; i <= n; ++i)87         ans[p[i].ans + p[i].s - 1] += p[i].s;88     for (i = 0; i < tot; ++i)89         printf("%d\n", ans[i]);90     return 0;91 }
View Code

 

BZOJ3262 陌上花开