[BOI Mokia]

来源:互联网 发布:梦冒险知乎 编辑:程序博客网 时间:2024/06/05 07:15

绳命中第一道CDQ




#include <iostream>#include <cstdio>#include <cstring>#include <algorithm> #define maxn 200010using namespace std; const int flag = -1; struct query{int x, y, num, pos, ans;query(int x = 0, int y = 0, int num = 0):x(x), y(y), num(num){}bool operator<(const query& k)const{return x < k.x;}void print(){printf("%d %d %d %d %d\n", x, y, num, pos, ans);}}q[maxn], nq[maxn]; bool cmp(const query& a, const query& b){return a.pos < b.pos;} int n, ans; namespace BIT{#define maxm 2000010int t[maxm], vis[maxm], tim;int n;inline int lowbit(int x){return x & -x;}void update(int pos, int val){if(!pos)return;for(int i = pos; i <= n; i += lowbit(i)){if(vis[i] == tim)t[i] += val;else t[i] = val;vis[i] = tim;}}int ask(int pos){if(!pos)return 0;int ret = 0;for(int i = pos; i; i -= lowbit(i))    if(vis[i] == tim)        ret += t[i];return ret;}}void solve(int l, int r){if(l == r)return;int mid = l + r >> 1;int l1 = l, l2 = mid + 1;for(int i = l; i <= r; i ++){if(q[i].pos <= mid)    nq[l1 ++] = q[i];else nq[l2 ++] = q[i];}memcpy(q + l, nq + l, sizeof (q[0]) * (r - l + 1));solve(l, mid);BIT::tim ++;int j = l;for(int i = mid + 1; i <= r; i ++){for(;q[j].x <= q[i].x && j <= mid; j ++)    if(q[j].num != flag)BIT::update(q[j].y, q[j].num);if(q[i].num == flag)q[i].ans += BIT::ask(q[i].y);}solve(mid + 1, r);l1 = l, l2 = mid + 1;for(int i = l; i <= r; i ++){if((q[l1] < q[l2] && l1 <= mid) || l2 > r)    nq[i] = q[l1 ++];else nq[i] = q[l2 ++];}memcpy(q + l, nq + l, sizeof (q[0]) * (r - l + 1));} int main(){    freopen("mokia.in", "r", stdin);freopen("mokia.out", "w", stdout);int mytest, p;scanf("%d%d", &mytest, &BIT::n);int x, y, z;int x1, y1, x2, y2;while(scanf("%d", &p), p != 3){if(p == 1){scanf("%d%d%d", &x, &y, &z);q[++ n] = query(x, y, z);}else{scanf("%d%d%d%d", &x1, &y1, &x2, &y2);q[++ n] = query(x1 - 1, y1 - 1, flag);q[++ n] = query(x2, y1 - 1, flag);      q[++ n] = query(x1 - 1, y2, flag);   q[++ n] = query(x2, y2, flag);  }}for(int i = 1; i <= n; i ++)    q[i].ans = 0, q[i].pos = i;    sort(q + 1, q + 1 + n);solve(1, n);sort(q + 1, q + 1 + n, cmp);int ans;for(int i = 1; i <= n; i ++){if(q[i].num == flag){ans = 0;ans += q[i ++].ans;ans -= q[i ++].ans;ans -= q[i ++].ans;ans += q[i].ans;printf("%d\n", ans);}}return 0;}


0 0
原创粉丝点击