[BOI Mokia]
2016-02-18 14:42
225 查看
绳命中第一道CDQ
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define maxn 200010 using 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 2000010 int 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; }
相关文章推荐
- 凌宇_Android之路_知识备忘录
- 设计模式之单件模式
- 1600 高级机密
- glove入门实战
- ASCII、Unicode、GBK和UTF-8字符编码的区别联系[转]
- 饿汉单例和懒汉单例
- 1042. Shuffling Machine (20)
- Machine Learning - Logistic Regression - Multi-class Classification
- java-httpclient-HTTPS请求
- Python 18.4 aiohttp
- 开发环境设置
- R语言对数据的基本管理
- 生成pch文件路径
- hive安装配置实验
- 使用Python来编写HTTP服务器的超级指南
- 在Windows下编译Mapnik的依赖库
- Ubuntu下搭建git服务器步骤
- 内外网同时上网
- Permission
- Linux TCP