码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1176 [Balkan2007]Mokia

时间:2015-03-02 23:48:57      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:

就是整体二分啦。。。

然后我们把一个矩形的询问拆成四个,按x排序按y加入bit中就可以O(n * logn^2)做出来啦~

 

技术分享
  1 /**************************************************************
  2     Problem: 1176
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:4620 ms
  7     Memory:25808 kb
  8 ****************************************************************/
  9  
 10 #include <cstdio>
 11 #include <algorithm>
 12  
 13 using namespace std;
 14 const int N = 2e6 + 5;
 15 const int Q = 2e5 + 5;
 16  
 17 struct query {
 18     int x, y, v, w, id, op;
 19      
 20     inline bool operator < (const query q) const {
 21         return x == q.x ? y == q.y ? op < q.op : y < q.y : x < q.x;
 22     }
 23 } q[Q], tmp[Q];
 24  
 25 int s, n, cnt, cnt_query;
 26 int BIT[N], ans[N];
 27  
 28 inline int read() {
 29     int x = 0, sgn = 1;
 30     char ch = getchar();
 31     while (ch < 0 || 9 < ch) {
 32         if (ch == -) sgn = -1;
 33         ch = getchar();
 34     }
 35     while (0 <= ch && ch <= 9) {
 36         x = x * 10 + ch - 0;
 37         ch = getchar();
 38     }
 39     return sgn * x;
 40 }
 41  
 42 inline void add_add() {
 43     q[++cnt].x = read(), q[cnt].y = read(), q[cnt].v = read(), q[cnt].id = cnt;
 44 }
 45  
 46 inline void add_query() {
 47     int x1 = read(), y1 = read(), x2 = read(), y2 = read(), w = ++cnt_query;
 48     q[++cnt].w = w, q[cnt].id = cnt, q[cnt].x = x1 - 1, q[cnt].y = y1 - 1, q[cnt].v = 1, q[cnt].op = 1;
 49     q[++cnt].w = w, q[cnt].id = cnt, q[cnt].x = x2, q[cnt].y = y2, q[cnt].v = 1, q[cnt].op = 1;
 50     q[++cnt].w = w, q[cnt].id = cnt, q[cnt].x = x1 - 1, q[cnt].y = y2, q[cnt].v = -1, q[cnt].op = 1;
 51     q[++cnt].w = w, q[cnt].id = cnt, q[cnt].x = x2, q[cnt].y = y1 - 1, q[cnt].v = -1, q[cnt].op = 1;
 52 }
 53  
 54 #define lowbit(x) x & -x
 55 inline void add(int x, int d) {
 56     while (x <= n)
 57         BIT[x] += d, x += lowbit(x);
 58 }
 59  
 60 inline int query(int x) {
 61     int res = 0;
 62     while (x)
 63         res += BIT[x], x -= lowbit(x);
 64     return res;
 65 }
 66 #undef lowbit
 67  
 68 void work(int l, int r) {
 69     if (l == r) return;
 70     int mid = l + r >> 1, i, l1, l2;
 71     for (i = l; i <= r; ++i) {
 72         if (q[i].id <= mid && q[i].op == 0) add(q[i].y, q[i].v);
 73         if (q[i].id > mid && q[i].op) ans[q[i].w] += q[i].v * query(q[i].y);
 74     }
 75     for (i = l; i <= r; ++i)
 76         if (q[i].id <= mid && q[i].op == 0) add(q[i].y, -q[i].v);
 77          
 78     l1 = l, l2 = mid + 1;
 79     for (i = l; i <= r; ++i)
 80         if (q[i].id <= mid) tmp[l1++] = q[i];
 81         else tmp[l2++] = q[i];
 82     for (i = l; i <= r; ++i) q[i] = tmp[i];
 83     work(l, mid), work(mid + 1, r);
 84 }
 85  
 86 int main() {
 87     int oper, i;
 88     s = read(), n = read();
 89     while (1) {
 90         oper = read();
 91         if (oper == 1) add_add();
 92         else if (oper == 2) add_query();
 93         else break;
 94     }
 95     sort(q + 1, q + cnt + 1);
 96     work(1, cnt);
 97     for (i = 1; i <= cnt_query; ++i)
 98         printf("%d\n", ans[i]);
 99     return 0;
100 }
View Code

 

BZOJ1176 [Balkan2007]Mokia

标签:

原文地址:http://www.cnblogs.com/rausen/p/4309851.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!