P4390 [BOI2007]Mokia 摩基亚(cdq分治)
一样是cdq的板子
照着园丁的烦恼就好了
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int w,cntq,cnta,nothing,type,qid,aid;
namespace BIT{
int bit[2000100];
int lowbit(int x){
return x&(-x);
}
void add(int pos,int x){
while(pos<=w){
bit[pos]+=x;
pos+=lowbit(pos);
}
}
int query(int pos){
int ans=0;
while(pos){
ans+=bit[pos];
pos-=lowbit(pos);
}
return ans;
}
void clear(int pos){
while(pos<=w){
if(bit[pos])
bit[pos]=0;
else
break;
pos+=lowbit(pos);
}
}
};
int ans[10100];
struct Query{
int type,val,posx,posy,IorD,aid;
bool operator < (const Query &b) const{
return posx==b.posx?type<b.type:posx<b.posx;
}
}query[200100];
Query tmp[200100];
void cdq(int L,int R){
// printf("%d %d",L,R);
if(R<=L+1)
return;
int mid=(L+R)>>1;
cdq(L,mid);
cdq(mid,R);
int l=L,r=mid,tot=0;
while(l<mid&&r<R){
if(query[l]<query[r]){
if(query[l].type==1)
BIT::add(query[l].posy,query[l].val);
tmp[++tot]=query[l++];
}
else{
if(query[r].type==2)
ans[query[r].aid]+=query[r].IorD*BIT::query(query[r].posy);
tmp[++tot]=query[r++];
}
}
while(l<mid)
tmp[++tot]=query[l++];
while(r<R){
if(query[r].type==2)
ans[query[r].aid]+=query[r].IorD*BIT::query(query[r].posy);
tmp[++tot]=query[r++];
}
for(int i=1;i<=tot;i++){
BIT::clear(tmp[i].posy);
query[L+i-1]=tmp[i];
}
}
int main(){
scanf("%d %d",¬hing,&w);
scanf("%d",&type);
w++;
while(type!=3){
if(type==1){
int x,y,a;
scanf("%d %d %d",&x,&y,&a);
// x+=2;y+=2;
x++,y++;
query[++qid].type=1;
query[qid].posy=y;
query[qid].posx=x;
query[qid].val=a;
}
else{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
// x1+=2,x2+=2,y1+=2,y2+=2;
x1++,x2++,y1++,y2++;
query[++qid].type=2;
query[qid].aid=++aid;
query[qid].IorD=1;
query[qid].posx=x2;
query[qid].posy=y2;
query[++qid].type=2;
query[qid].aid=aid;
query[qid].IorD=-1;
query[qid].posx=x1-1;
query[qid].posy=y2;
query[++qid].type=2;
query[qid].aid=aid;
query[qid].IorD=-1;
query[qid].posx=x2;
query[qid].posy=y1-1;
query[++qid].type=2;
query[qid].aid=aid;
query[qid].IorD=1;
query[qid].posx=x1-1;
query[qid].posy=y1-1;
}
scanf("%d",&type);
}
cdq(0,qid+1);
for(int i=1;i<=aid;i++)
printf("%d\n",ans[i]);
return 0;
}
P4390 [BOI2007]Mokia 摩基亚(cdq分治)的更多相关文章
- Luogu P4390 [BOI2007]Mokia 摩基亚 | CDQ分治
题目链接 $CDQ$分治. 考虑此时在区间$[l,r]$中,要计算$[l,mid]$中的操作对$[mid+1,r]$中的询问的影响. 计算时,排序加上树状数组即可. 然后再递归处理$[l,mid]$和 ...
- cogs1752[boi2007]mokia 摩基亚 (cdq分治)
[题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...
- P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...
- 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告
P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...
- [洛谷P4390][BOI2007]Mokia 摩基亚
题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...
- P4390 [BOI2007]Mokia 摩基亚
传送门 对于一个询问 $(xa,ya),(xb,yb)$,拆成 $4$ 个询问并容斥一下 具体就是把询问变成求小于等于 $xb,yb$ 的点数,减去小于等于 $xa-1,yb$ 和小于等于 $xb,y ...
- 【BZOJ1176】[BOI2007]Mokia 摩基亚
[BZOJ1176][BOI2007]Mokia 摩基亚 题面 bzoj 洛谷 题解 显然的\(CDQ\)\(/\)树套树题 然而根本不想写树套树,那就用\(CDQ\)吧... 考虑到点\((x1,y ...
- [BOI2007]Mokia 摩基亚
Description: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫 ...
- 【cdq分治】【P4390】[BOI2007]Mokia 摩基亚
Description 给你一个 \(W~\times~W\) 的矩阵,每个点有权值,每次进行单点修改或者求某子矩阵内权值和,允许离线 Input 第一行是两个数字 \(0\) 和矩阵大小 \(W\) ...
随机推荐
- uva 1416 Warfare And Logistics
题意: 给出一个无向图,定义这个无向图的花费是 其中path(i,j),是i到j的最短路. 去掉其中一条边之后,花费为c’,问c’ – c的最大值,输出c和c’. 思路: 枚举每条边,每次把这条边去掉 ...
- C# CheckBox与RadioButton
通常RadioBox称为单选按钮,CheckBox称为多选按钮,这两个控件都是从ButtonBase类中派生,可以将其视为按钮. 多个checkBox之间的选择是互相独立的,互补影响.多个RadioB ...
- golang学习笔记5 用bee工具创建项目 bee工具简介
golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...
- FTP搭建 共享上网 穿透内网外网
1.ftp原理介绍 FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口, 一个数据端口和一个命令端口(或称为控制端口).通常21端口是命令端口,20端口是数据 ...
- Autel MaxiSys Pro MS908P Software Update Gudie
This article aims to guide on how to update software for Autel MaxiSys Pro. (Suitable for MaxiDiag E ...
- kali linux 压缩文件解压缩命令(包含7z)
tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压1 ...
- 怎样从外网访问内网Linux系统?
本地安装了一个Linux系统,只能在局域网内访问到,怎样从外网也能访问到本地的Linux系统呢?本文将介绍具体的实现步骤. 1. 准备工作 1.1 启动Linux系统 默认Linux系统ssh服务端端 ...
- selenium自动化之鼠标操作
在做自动化测试的时候,经常会遇到这种情况,某个页面元素,你必须要把鼠标移动到上面才能显示出元素.那么这种情况,我们怎么处理呢?,selenium给我们提供了一个类来处理这类事件——ActionChai ...
- Firefox创建firefoxprofile
我们自动化测试的时候,有时不需要图片加载出来,提高浏览器加载速度,从而提高脚本的执行速度.另外在一些网络比较差的环境下,禁用css.图片等加载可以提高访问速度 方法: 1.创建自己的firefoxpr ...
- c++ STL中的next_permutation
default (1) template <class BidirectionalIterator> bool next_permutation (BidirectionalIterato ...