bzoj1176: [Balkan2007]Mokia【cdq分治】

  把询问搞成4个,cdq分治。

 1 #include <bits/stdc++.h>
 2 #define rep(i, a, b) for (int i = a;i <= b; i++)
 3 #define drep(i, a, b) for (int i = a; i >= b; i--)
 4 #define REP(i, a, b) for (int i = a; i < b; i++)
 5 #define mp make_pair
 6 #define pb push_back
 7 #define clr(x) memset(x, 0, sizeof(x))
 8 #define xx first
 9 #define yy second
10 using namespace std;
11 typedef long long i64;
12 typedef pair<int, int> pii;
13 const int inf = ~0U >> 1;
14 const i64 INF = ~0ULL >> 1;
15 //**********************************
16  
17 const int maxn = 200005;
18  
19 int c[2000005], w;
20 struct Complex {
21     int flag;
22     int x, y, c;
23     int id, ans;
24     int pos, l;
25     inline bool operator < (const Complex &a) const {
26         return x < a.x || 
27             x == a.x && y < a.y ||
28             x == a.x && y == a.y && c < a.c;
29     }
30 } src[maxn], t[maxn];
31  
32 inline void add(int x, int v) {
33     while (x <= w) {
34         c[x] += v;
35         x += x & -x;
36     }
37 }
38 inline int get(int x) {
39     int ret(0);
40     while (x > 0) {
41         ret += c[x];
42         x -= x & -x;
43     }
44     return ret;
45 }
46 int ans[10005];
47  
48 void cdq(int l, int r) {
49     if (l == r) return;
50     int mid = l + r >> 1, l1 = l, l2 = mid + 1;
51     rep(i, l, r) {
52         if (src[i].id <= mid && !src[i].l) add(src[i].y, src[i].c);
53         if (src[i].id > mid && src[i].l) ans[src[i].pos] += src[i].l * get(src[i].y);
54     }
55     rep(i, l, r) if (src[i].id <= mid && !src[i].l) add(src[i].y, -src[i].c);
56     rep(i, l, r) if (src[i].id <= mid) t[l1++] = src[i]; else t[l2++] = src[i];
57     memcpy(src + l, t + l, (r - l + 1) * sizeof(Complex));
58     cdq(l, mid); cdq(mid + 1, r);
59 }
60  
61 int main() {
62     int cnt(0), n(0), s;
63     scanf("%d%d", &s, &w);
64     int flag;
65     while (scanf("%d", &flag), flag ^ 3) {
66         if (flag == 1) {
67             ++n;
68             src[n].id = n; src[n].l = 0; src[n].pos = 0;
69             scanf("%d%d%d", &src[n].x, &src[n].y, &src[n].c);
70         }
71         else {
72             int x, y, a, b; scanf("%d%d%d%d", &x, &y, &a, &b);
73  
74             ans[++cnt] = s * (a - x) * (b - y);
75  
76             ++n;
77             src[n].id = n; src[n].l = 1; src[n].pos = cnt;
78             src[n].x = a, src[n].y = b, src[n].c = inf;
79  
80             ++n;
81             src[n].id = n; src[n].l = -1; src[n].pos = cnt;
82             src[n].x = a, src[n].y = y - 1, src[n].c = inf;
83  
84             ++n;
85             src[n].id = n; src[n].l = -1; src[n].pos = cnt;
86             src[n].x = x - 1, src[n].y = b, src[n].c = inf;
87  
88             ++n;
89             src[n].id = n; src[n].l = 1; src[n].pos = cnt;
90             src[n].x = x - 1, src[n].y = y - 1, src[n].c = inf;
91         }
92     }
93     sort(src + 1, src + n + 1);
94     cdq(1, n);
95     rep(i, 1, cnt) printf("%d\n", ans[i]);
96     return 0;
97 }
View Code

 

你可能感兴趣的:(bzoj1176: [Balkan2007]Mokia【cdq分治】)