题目名称 1752. [BOI 2007] 摩基亚Mokia
输入输出 mokia.in/out
难度等级 ★★★☆
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 10
题目来源 Gravatarcstdio 于2014-10-20加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:292, 提交:800, 通过率:36.5%
Gravatarpb0207 100 1.074 s 14.81 MiB C++
Gravatarthmyl 100 1.220 s 14.81 MiB C++
Gravatarthmyl 100 1.235 s 14.81 MiB C++
Gravatarliouzhou_101 100 1.235 s 19.63 MiB C++
Gravatarbbsh 100 1.243 s 27.76 MiB C++
GravatarHzoi_moyi 100 1.261 s 16.38 MiB C++
Gravatarrvalue 100 1.264 s 47.62 MiB C++
GravatarIronk 100 1.267 s 15.65 MiB C++
GravatarMashiroSky 100 1.273 s 39.23 MiB C++
GravatarCooook 100 1.283 s 17.60 MiB C++
关于 摩基亚Mokia 的近10条评论(全部评论)
询问很少,块长开尽量大。
Gravatar┭┮﹏┭┮
2024-08-23 21:26 34楼
这题蓝书上讲的那点东西估计很难做出来,上网学学三维偏序的CDQ分治解法再来写会好很多
Gravataryrtiop
2021-11-26 22:35 33楼
本机拍没问题,交上去就wa(雾
GravatarHale
2019-08-04 18:01 32楼
加了个fread版超级读入优化之后,我终于用树状数组套splay过了这道题。(不开O2不开C++11)
GravatarGKxx
2018-08-11 21:48 31楼
zzwzz
GravatarHzoi_Ivan
2017-12-10 08:39 30楼
回复 @하루Kiev :
wx太强了QWQ
要不是您我不会CDQ啊QWQ
GravatarHzoi_Mafia
2017-10-25 16:47 29楼
CDQ首题
Gravatar하루Kiev
2017-10-25 16:28 28楼
[size=40]给你个大米饼![/size]
#include<stdio.h>
#include<algorithm>
#define go(i,a,b) for(int i=a;i<=b;i++)
using namespace std;const int N=2000003;
struct Q{int x,y,v,kind,ID;}q[N];
bool cmp(Q a,Q b){return a.x<b.x;}int w,c[N],ans[N/200];
void ADD(int x,int d){while(x<=w)c[x]+=d,x+=x&(-x);}
int SUM(int x){int res=0;while(x)res+=c[x],x-=x&(-x);return res;}
void CDQ_dichotomy(int l,int r)
{
if(l==r)return;int mid=l+r>>1;
CDQ_dichotomy(l,mid);CDQ_dichotomy(mid+1,r);
sort(q+l,q+mid+1,cmp);sort(q+mid+1,q+r+1,cmp);
int j=l;go(i,mid+1,r)
{
while(j<=mid&&q[j].x<=q[i].x)
q[j].kind?ADD(q[j].y,q[j].v),1:1,j++;
!q[i].kind?ans[q[i].ID]+=q[i].v*SUM(q[i].y):1;
}
go(i,l,j-1)if(q[i].kind)ADD(q[i].y,-q[i].v);
}
int main(){int t,x,y,a,b,k=0,num=0;while(scanf("%d",&t)&&t!=3)
{
if(t==0)scanf("%d",&w);
if(t==1)scanf("%d%d%d",&x,&y,&a),q[++k]=(Q){x,y,a,1,0};
if(t==2)scanf("%d%d%d%d",&x,&y,&a,&b),
q[++k]=(Q){a,b,1,0,++num},q[++k]=(Q){x-1,y-1,1,0,num},
q[++k]=(Q){x-1,b,-1,0,num},q[++k]=(Q){a,y-1,-1,0,num};
}
CDQ_dichotomy(1,k);go(i,1,num)printf("%d\n",ans[i]);return 0;
}//Paul_Guderian
GravatarPaul_Guderian
2017-05-26 20:27 27楼
Gravatargls1196
2017-02-15 17:50 26楼
Gravatarrewine
2017-02-11 07:47 25楼

1752. [BOI 2007] 摩基亚Mokia

★★★☆   输入文件:mokia.in   输出文件:mokia.out   简单对比
时间限制:1 s   内存限制:128 MiB

【题目描述】

摩尔瓦多的移动电话公司摩基亚($Mokia$)设计出了一种新的用户定位系统。和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米。但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题。

在定位系统中,世界被认为是一个$W \times W$的正方形区域,由$1 \times 1$的方格组成。每个方格都有一个坐标$(x,y),1\leq x,y\leq W$。坐标的编号从$1$开始。对于一个$4 \times 4$的正方形,就有$1\leq x\leq 4,1\leq y\leq 4$(如图):

请帮助Mokia公司编写一个程序来计算在某个矩形区域内有多少名用户。

【输入格式】

有三种命令,意义如下:

命令 参数 意义
0 W 初始化一个全零矩阵。本命令仅开始时出现一次。
1 x y A 向方格$(x,y)$中添加A个用户。A是正整数。
2 X1 Y1 X2 Y2 查询$X1\leq x\leq X2,Y1\leq y\leq Y2$所规定的矩形中的用户数量
3 无参数 结束程序。本命令仅结束时出现一次。

【输出格式】

对所有命令2,输出一个一行整数,即当前询问矩形内的用户数量。

【输入样例】

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

【输出样例】

3
5

【提示】

输入 输出 意义
0 4
大小为$4 \times 4$的全零正方形
1 2 3 3
向$(2,3)$方格加入3名用户
2 1 1 3 3
查询矩形$1\leq x\leq 3,1\leq y\leq 3$内的用户数量

3 查询结果
1 2 2 2
向$(2,2)$方格加入2名用户
2 2 2 3 4
查询矩形$2\leq x\leq 3,2\leq y\leq 4$内的用户数量

5 查询结果
3
终止程序

【数据规模】

$1\leq W\leq 2000000,1\leq X1\leq X2\leq W,1\leq Y1\leq Y2\leq W,1\leq x,y\leq W,0<A\leq 10000$。

命令1不超过$160000$个。

命令2不超过$10000$个。

【来源】

Balkan Olypiad in Informatics 2007,$Mokia$