您的位置:首页 > Web前端 > JavaScript

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: