upd:\((x1,y1)(x2,y2)\)表示以\((x1,y1)\)为左上端点 \((x2,y2)\)为右下端点的矩形

本来以为是一道二位树状数组的模板,但是看数据范围之后就放弃了,边界既然到了2000000,那么我们只能使用其他办法来代替树状数组

于是,CDQ分治就诞生了!

此题我们可以把问题转化成cdq分治模板

回忆一下二位树状数组是怎么求二维区间查询的:对于区间[x1,y1][x2,y2],我们把它转化成$ (1,1)(x1-1,y1-1)+(1,1)(x2,y2)-(1,1)(x1-1,y2)-(1,1)(x2,y1-1) $求即可,所以对于每一个询问操作,把他看成四个坐标,求出前缀和就能找到答案

把操作的时间看作一维(时间在前的才可能对后面的操作有影响),把x,y看作后两维,对于\((1,1)(x,y)\),那么问题就转化成了\(timea<timeb xa<xb ya<yb\)的数量,也就是三位偏序模板了

注意几点:

1、树状数组的下标不能为0(0的lowbit的值也是0),所以我们需要把每一个点横纵坐标加一,最后w也要记得+1

2、注意区分询问和加法,在操作树状数组时要区分

给出代码:

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
#define debug printf("Now is Line : %d\n",__LINE__)
il int read()
{
re int x=0,f=1;re char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return x*f;
}
#define lb(x) (x)&-(x)
#define maxn 200005
#define maxm 2000005
struct node
{
int tim,x,y,val,id;
}e[maxn];
int cnt,a[maxm],w;
il void add(int x,int v)
{
while(x<=w)
{
a[x]+=v;
x+=lb(x);
}
}
il int query(int x)
{
int ans=0;
while(x)
{
ans+=a[x];
x-=lb(x);
}
return ans;
}
il bool cmp1(node a,node b)
{
return (a.x==b.x)?(a.y<b.y):(a.x<b.x);
}
il bool cmp(node a,node b)
{
return a.tim<b.tim;
}
il void CDQ(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
CDQ(l,mid),CDQ(mid+1,r);
sort(e+l,e+mid+1,cmp1);
sort(e+mid+1,e+r+1,cmp1);
re int i=l,j=mid+1;
for(;j<=r;++j)
{
while(e[i].x<=e[j].x&&i<=mid)
{
if(e[i].id==0) add(e[i].y,e[i].val);
++i;
}
if(e[j].id==1) e[j].val+=query(e[j].y);
}
for(j=l;j<i;++j) if(e[j].id==0) add(e[j].y,-e[j].val);
}
int main()
{
read(),w=read()+1;
int opt=read();
while(opt!=3)
{
if(opt==1)
{
int x=read()+1,y=read()+1,val=read();
e[++cnt]=(node){cnt,x,y,val,0};
}
else
{
int x1=read(),y1=read(),x2=read()+1,y2=read()+1;
e[++cnt]=(node){cnt,x1,y1,0,1};
e[++cnt]=(node){cnt,x2,y2,0,1};
e[++cnt]=(node){cnt,x2,y1,0,1};
e[++cnt]=(node){cnt,x1,y2,0,1};
}
opt=read();
}
CDQ(1,cnt);
sort(e+1,e+cnt+1,cmp);
for(re int i=1;i<=cnt;++i)
{
if(e[i].id==1)
{
printf("%d\n",e[i].val+e[i+1].val-e[i+2].val-e[i+3].val);
i+=3;
}
}
return 0;
}

[BOI2007]Mokia 摩基亚(CDQ分治)的更多相关文章

  1. cogs1752[boi2007]mokia 摩基亚 (cdq分治)

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

  2. Luogu P4390 [BOI2007]Mokia 摩基亚 | CDQ分治

    题目链接 $CDQ$分治. 考虑此时在区间$[l,r]$中,要计算$[l,mid]$中的操作对$[mid+1,r]$中的询问的影响. 计算时,排序加上树状数组即可. 然后再递归处理$[l,mid]$和 ...

  3. P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)

    题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...

  4. 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告

    P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...

  5. 【BZOJ1176】[BOI2007]Mokia 摩基亚

    [BZOJ1176][BOI2007]Mokia 摩基亚 题面 bzoj 洛谷 题解 显然的\(CDQ\)\(/\)树套树题 然而根本不想写树套树,那就用\(CDQ\)吧... 考虑到点\((x1,y ...

  6. [BOI2007]Mokia 摩基亚

    Description: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫 ...

  7. 【cdq分治】【P4390】[BOI2007]Mokia 摩基亚

    Description 给你一个 \(W~\times~W\) 的矩阵,每个点有权值,每次进行单点修改或者求某子矩阵内权值和,允许离线 Input 第一行是两个数字 \(0\) 和矩阵大小 \(W\) ...

  8. [洛谷P4390][BOI2007]Mokia 摩基亚

    题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...

  9. P4390 [BOI2007]Mokia 摩基亚

    传送门 对于一个询问 $(xa,ya),(xb,yb)$,拆成 $4$ 个询问并容斥一下 具体就是把询问变成求小于等于 $xb,yb$ 的点数,减去小于等于 $xa-1,yb$ 和小于等于 $xb,y ...

随机推荐

  1. Window.scrollTo()

    摘要 滚动到文档中的某个坐标. 语法 window.scrollTo(x-coord,y-coord ) window.scrollTo(options) 参数 x-coord 是文档中的横轴坐标. ...

  2. golang操作mysql使用总结

    前言 Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能: sql.DB 通过数据库驱动为我们提供管理底层 ...

  3. 搭建ELK日志分析系统

    看了辣么多博客,就数这个最详细最容易理解了:https://blog.csdn.net/qq_22211217/article/details/80764568 >>>>> ...

  4. 虚拟机安装CentOS7之后没有ip的问题

    CentOS 7 默认是不启动网卡的(ONBOOT=no),主要是修改一下网上配置,然后重起便可,看这篇博客操作: https://blog.csdn.net/dancheren/article/de ...

  5. WPF中元素拖拽的两个实例

    今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结,这里主要用两个例子来说明在WPF中如何使用拖拽进行操作,元素拖拽是一个常见的操作,第一个拖拽的例子是将ListBox中的子元素拖拽到ListV ...

  6. Delphi之TComponent类

    TComponent类 TComponent类直接由TPersistent派生.TComponent的独特特征是它的属性能够在设计期间通过ObjectInspector来控制,能够拥有其他组件.非可视 ...

  7. 十、ABP

    一.官网 安装 安装成功Core 2.2版本的

  8. Lodop输出页面input文本框的最新值

    默认使用Lodop打印页面上的文本框等,会发现虽然页面上文本框输入了值,打印预览却是空的,这是由于没有把最新的值传入Lodop. 如图,演示的是Lodop如何输出文本框内的新值,这里整个页面只有inp ...

  9. JS实现控制HTML5背景音乐播放暂停

    首先在网页中嵌入背景音乐,html5代码为: <script src="http://wuover.qiniudn.com/jquery.js"></script ...

  10. c++ string类型的定义及方法

    1.c++ 有两种风格的字符串形式  c风格字符串  定义及初始化  char a[]={'h','e','l','l','o','\0'}  或者  char a[]="hello&quo ...