[COGS 1752] 摩基亚Mokia
照例先上题面
1752. [BOI2007]摩基亚Mokia
输入文件:mokia.in 输出文件:mokia.out
时间限制:1.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(如图):
请帮助Mokia公司编写一个程序来计算在某个矩形区域内有多少名用
【输入格式】
有三种命令,意义如下:
命令
参数
意义
0
W
初始化一个全零矩阵。本命令仅开始时出现一次。
1
x y A
向方格(x,y)中添加A个用户。A是正整数。
2
X1 Y1 X2 Y2
查询X1<=x<=X2,Y1<=y<=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×4的全零正方形
1 2 3 3
向(2,3)方格加入3名用户
2 1 1 3 3
查询矩形1<=x<=3,1<=y<=3内的用户数量
3
查询结果
1 2 2 2
向(2,2)方格加入2名用户
2 2 2 3 4
查询矩形2<=x<=3,2<=y<=4内的用户数量
5
查询结果
3
终止程序
【数据规模】
1<=W<=2000000
1<=X1<=X2<=W
1<=Y1<=Y2<=W
1<=x,y<=W
0<A<=10000
命令1不超过160000个。
命令2不超过10000个。
【来源】
Balkan Olypiad in Informatics 2007,Mokia
一句话题意:维护一个W*W的矩阵,初始值均为0.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.
看到题之后第一眼我们或许会考虑二维树状数组,但是后来我们发现这个蜜汁数据范围刚好卡掉了$O((M+Q)*log^2W)$的二维树状数组...
然后我们注意到题目没有要求强制在线,所以我们可以考虑CDQ分治来解决这个问题.
CDQ分治的详解我打算放在下一篇博文w所以在这里先不详细解释了QwQ
作为CDQ分治的裸题我就直接贴袋马了憋打我(逃
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXW=;
const int MAXA=; struct Node{
int x;
int y;
int ID;
int value;
int position;
int operation;
bool operator<(const Node& x)const{
if(this->x==x.x&&this->y==x.y)
return this->operation<x.operation;
else
return this->x==x.x?this->y<x.y:this->x<x.x;
}
};
Node query[MAXA];
Node tmp[MAXA]; int n;
int m;
int cnt;
int c[MAXW];
int ans[MAXA]; int Query(int);
int LowBit(int);
void Add(int,int);
void FastRead(int&);
void CDQ(int,int); int main(){
#ifndef ASC_LOCAL
freopen("mokia.in","r",stdin);
freopen("mokia.out","w",stdout);
#endif
int operation;
FastRead(n);
FastRead(n);
while(true){
FastRead(operation);
if(operation==){
++m;
FastRead(query[m].x);
FastRead(query[m].y);
FastRead(query[m].value);
query[m].operation=;
}
else if(operation==){
int x1,x2,y1,y2;
cnt++;
FastRead(x1);
FastRead(y1);
FastRead(x2);
FastRead(y2);
query[++m].position=cnt;
query[m].x=x1-;
query[m].y=y1-;
query[m].value=;
query[m].operation=; query[++m].position=cnt;
query[m].x=x2;
query[m].y=y2;
query[m].value=;
query[m].operation=; query[++m].position=cnt;
query[m].x=x1-;
query[m].y=y2;
query[m].value=-;
query[m].operation=; query[++m].position=cnt;
query[m].x=x2;
query[m].y=y1-;
query[m].value=-;
query[m].operation=;
}
else break;
}
for(int i=;i<=m;i++)
query[i].ID=i;
std::sort(query+,query+m+);
CDQ(,m);
for(int i=;i<=cnt;i++)
printf("%d\n",ans[i]);
return ;
} void CDQ(int l,int r){
if(l==r)
return;
int mid=(l+r)>>;
int ll=l;
int lr=mid+;
for(int i=l;i<=r;i++){
if(query[i].ID<=mid&&query[i].operation==)
Add(query[i].y,query[i].value);
if(query[i].ID>mid&&query[i].operation==)
ans[query[i].position]+=query[i].value*Query(query[i].y);
}
for(int i=l;i<=r;i++){
if(query[i].ID<=mid&&query[i].operation==)
Add(query[i].y,-query[i].value);
}
for(int i=l;i<=r;i++){
if(query[i].ID<=mid)
tmp[ll++]=query[i];
else
tmp[lr++]=query[i];
}
for(int i=l;i<=r;i++)
query[i]=tmp[i];
CDQ(l,mid);
CDQ(mid+,r);
} inline int Query(int x){
int ans=;
for(;x>;x-=LowBit(x)){
ans+=c[x];
}
return ans;
} inline void Add(int x,int d){
for(;x<=n;x+=LowBit(x)){
c[x]+=d;
}
} inline int LowBit(int x){
return x&-x;
} void FastRead(int& target){
target=;
register char ch=getchar();
while(!isdigit(ch)&&ch!=EOF)
ch=getchar();
while(isdigit(ch)){
target=target*+ch-'';
ch=getchar();
}
}
Backup
扔个图就跑

[COGS 1752] 摩基亚Mokia的更多相关文章
- COJS 1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia ★★★ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ...
- COGS1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia ★★☆ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ...
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...
- 分治(CDQ):[BOI2007]摩基亚Mokia
[题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...
- COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能够回 ...
- 【COGS1752】 BOI2007—摩基亚Mokia
http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ...
- Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia
题目 Cogs 没有Bzoj的权限号 Sol 离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二位前缀和 那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以 ...
- COGS1752. [BOI2007]摩基亚Mokia CDQ
CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- [BOI2007]Mokia 摩基亚
Description: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫 ...
随机推荐
- TypeScript技巧集锦(陆续更新)
在C++项目中编译TypeScript(以下简称ts) 编辑ts文件的属性,项类型选择"自定义生产工具". 命令行输入tsc所在位置与编译参数,我的是"C:\Progra ...
- 前端的3D(css3版本)
其实是依托Css3的功劳,先上一个例子 代码地址:链接: https://pan.baidu.com/s/1sldhljJ 密码: i6qh 这动画纵有万般变化,也离不开以下几个属性 transfor ...
- CSS实现矩形按钮右边缘的中间有个往里凹的小半圆
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- ionic结合HTML5实现打电话功能
HTML5中这样子可以实现打电话的功能,但是在ionic实际项目中,并不是直接就可以这样子用,需要配置一下config.xml文件就可以在手机上调用到自己的联系人打电话页面了, 因为项目是引用的Cor ...
- phpcms v9 调用自定义字段多图片的第一张或第N张图为缩略图
1.打开相应要使用组图的模型的组图字段,添加组图 字段提示为 <div class="content_attr"> <label><input typ ...
- webpack2教程--从入门到放弃
开车之前,先介绍一些npm的命令: :D 进入D盘 mkdir webapp 创建webapp文件夹 cd webapp 进入webapp文件夹 mkdir webapp && cd ...
- Linux网络服务12——NFS共享服务
Linux网络服务12--NFS共享服务 一.NFS简介 端口号:TCP.UDP 111端口 NFS(Network File System)网络文件系统,是一种基于TCP/IP传输的网络文件系统协议 ...
- 架构漫谈系列(2) 封装(Encapsulation)
这是这个系列的第二篇.在第二篇里,我决定讲一讲封装. 程序的不同部分应该用封装去互相隔离,模块之间应该不应该产生很随意的关联. 可能有的人觉得不解,又或觉得是有道理的废话,不急,先一步一步来. 我们先 ...
- java自带uuid生成
java自带uuid生成UUID.randomUUID().toString()
- win7休眠的开启与关闭方法
从开始菜单中找到“附件→命令提示符”,右击选择“以管理员身份运行”,此时可能需要输入管理员密码或进行UAC确认,手工输入如下命令:powercfg -a,从这里可以清楚的看到,计算机是支持休眠的,只是 ...