COJS 1752. [BOI2007]摩基亚Mokia
2015-08-12 17:28
711 查看
1752. [BOI2007]摩基亚Mokia
★★★ 输入文件:mokia.in输出文件:
mokia.out简单对比
时间限制:5 s 内存限制:128 MB
【题目描述】
摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统。和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米。但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题。在定位系统中,世界被认为是一个W*W的正方形区域,由1*1的方格组成。每个方格都有一个坐标(x,y),1<=x,y<=W。坐标的编号从1开始。对于一个4*4的正方形,就有1<=x<=4,1<=y<=4(如图):
#include <bits/stdc++.h> using namespace std; const int maxn = 300010; struct QU { int x1,x2,y,f,id; bool operator<(const QU &t) const { return y == t.y?id < t.id:y < t.y; } } A[maxn<<1],B[maxn<<1],Q[maxn<<1]; int C[maxn<<1],Li[maxn<<1],ans[maxn<<1],tot,cnt,ask; void add(int i,int val) { for(; i < maxn; i += i&(-i)) C[i] += val; } int sum(int i) { int ret = 0; for(; i > 0; i -= i&(-i)) ret += C[i]; return ret; } void cdq(int L,int R) { if(R <= L) return; int mid = (L + R)>>1; cdq(L,mid); cdq(mid + 1,R); int a = 0,b = 0,j = 0; for(int i = L; i <= mid; ++i) if(Q[i].id == -1) A[a++] = Q[i]; for(int i = mid+1; i <= R; ++i) if(Q[i].id != -1) B[b++] = Q[i]; sort(A,A + a); sort(B,B + b); for(int i = 0; i < b; ++i) { for(; j < a && A[j].y <= B[i].y; ++j) add(A[j].x1,A[j].f); ans[B[i].id] += B[i].f*sum(B[i].x2); ans[B[i].id] -= B[i].f*sum(B[i].x1); } for(int i = 0; i < j; ++i) add(A[i].x1,-A[i].f); } int main() { int n,op; freopen ( "mokia.in", "r", stdin ) ; freopen ( "mokia.out", "w", stdout ) ; while(~scanf("%*d%d",&n)) { memset(C,0,sizeof C); memset(ans,0,sizeof ans); tot = cnt = ask = 0; while(scanf("%d",&op),op < 3) { if(op == 1) { scanf("%d%d%d",&Q[cnt].x1,&Q[cnt].y,&Q[cnt].f); Li[tot++] = Q[cnt].x1; Q[cnt++].id = -1; } else if(op == 2) { scanf("%d%d%d%d",&Q[cnt].x1,&Q[cnt+1].y,&Q[cnt+1].x2,&Q[cnt].y); Li[tot++] = Q[cnt].x1-1; Li[tot++] = Q[cnt+1].x2; --Q[cnt+1].y; Q[cnt].x2 = Q[cnt+1].x2; Q[cnt+1].x1 = Q[cnt].x1; Q[cnt].id = Q[cnt+1].id = ask++; Q[cnt++].f = 1; Q[cnt++].f = -1; } } sort(Li,Li + tot); tot = unique(Li,Li + tot) - Li; for(int i = 0; i < cnt; ++i) { if(Q[i].id == -1) Q[i].x1 = lower_bound(Li,Li + tot,Q[i].x1) - Li + 1; else { Q[i].x1 = lower_bound(Li,Li + tot,Q[i].x1 - 1) - Li + 1; Q[i].x2 = lower_bound(Li,Li + tot,Q[i].x2) - Li + 1; } } cdq(0,cnt-1); for(int i = 0; i < ask; ++i) printf("%d\n",ans[i]); } return 0; }
View Code
相关文章推荐
- 比较net.sf.json和org.json
- js代码触发onchange事件
- js_事件流
- js浮点数精确计算(加、减、乘、除)
- 在光标选中位置插入文字js
- js如何查看元素类型
- js正则表达式test()和exec()用法实例
- js正则表达式实例(汇总)
- <a>标签中href="javascript:;"表示什么意思?
- js获取自定义属性值
- 原生JS开发酷炫版飞机大战源码下载仅此一家
- Webform & JavaScript
- JavaScript常用字符串处理方法
- Extjs中的success和failure
- JavaScript中的call方法和apply方法使用对比
- js_鼠标点击事件:简单全选功能
- javascript中Math ceil(),floor(),round()三个函数的对比
- js笔记
- Javascript 面向对象
- 从本地JSON文件中读取数据