Luogu P4390 [BOI2007]Mokia 摩基亚 | CDQ分治
$CDQ$分治。
考虑此时在区间$[l,r]$中,要计算$[l,mid]$中的操作对$[mid+1,r]$中的询问的影响。
计算时,排序加上树状数组即可。
然后再递归处理$[l,mid]$和$[mid+1,r]$。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=2000005;
struct data
{
int opt,x,y,y1,w,num;
data(int a=0,int b=0,int c=0,int d=0,int e=0,int f=0)
{opt=a,x=b,y=c,y1=d,w=e,num=f;}
}s[200005],g[200005];
bool cmp(data u,data v)
{return (u.x==v.x)?(u.opt<v.opt):(u.x<v.x);}
int ans[10005],val[2000100];
int lowbit(int x) {return x&(-x);}
void add(int x,int y) {for(;x<=MAX;x+=lowbit(x)) val[x]+=y;}
int ask(int x) {int ans=0;for(;x;x-=lowbit(x))ans+=val[x];return ans;}
void cln(int x) {for(;x<=MAX;x+=lowbit(x)) val[x]=0;}
int Get(int l,int r) {return ask(r)-ask(l-1);}
void Sol(int l,int mid,int r)
{
int k=0;
for(int i=l;i<=mid;i++)
if(s[i].opt==1) g[++k]=s[i];
for(int i=mid+1;i<=r;i++)
if(s[i].opt!=1) g[++k]=s[i];
sort(g+1,g+k+1,cmp);
for(int i=1;i<=k;i++)
{
if(g[i].opt==1) add(g[i].y,g[i].w);
if(g[i].opt==2) ans[g[i].num]-=Get(g[i].y,g[i].y1);
if(g[i].opt==3) ans[g[i].num]+=Get(g[i].y,g[i].y1);
}
for(int i=1;i<=k;i++)
if(g[i].opt==1) cln(g[i].y);
}
void CDQ(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
CDQ(l,mid),CDQ(mid+1,r);
Sol(l,mid,r);
}
int main()
{
int n=0,cnt=0,tot=0;
scanf("%d%d",&n,&n);
for(;;)
{
int opt=0;
scanf("%d",&opt);
if(opt==3) break;
if(opt==1)
{
s[++cnt].opt=1;
scanf("%d%d%d",&s[cnt].x,&s[cnt].y,&s[cnt].w);
s[cnt].x++,s[cnt].y++;
}
if(opt==2)
{
tot++;
s[++cnt].opt=2,s[cnt].num=tot;
scanf("%d%d",&s[cnt].x,&s[cnt].y),s[cnt].y++;
s[++cnt].opt=3,s[cnt].num=tot;
scanf("%d%d",&s[cnt].x,&s[cnt].y1),s[cnt].x++,s[cnt].y1++;
s[cnt].y=s[cnt-1].y;
s[cnt-1].y1=s[cnt].y1;
}
}
CDQ(1,cnt);
for(int i=1;i<=tot;i++) printf("%d\n",ans[i]);
return 0;
}
Luogu P4390
Luogu P4390 [BOI2007]Mokia 摩基亚 | CDQ分治的更多相关文章
- P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...
- cogs1752[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 ...
- P4390 [BOI2007]Mokia 摩基亚(cdq分治)
一样是cdq的板子 照着园丁的烦恼就好了 代码 #include <cstdio> #include <cstring> #include <algorithm> ...
- 【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\) ...
随机推荐
- 截断误差VS舍入误差
截断误差:是指计算某个算式时没有精确的计算结果,如积分计算,无穷级数计算等,使用极限的形式表达的,显然我们只能截取有限项进行计算,此时必定会有误差存在,这就是截断误差. 舍入误差:是指由于计算机表示 ...
- HDU - 3790 最短路径问题 (dijkstra算法)
HDU - 3790 最短路径问题 Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费 ...
- 关于python如何构造测试数据
参考资料:https://www.cnblogs.com/miaoxiaochao/p/13234589.html 一.Faker模块是什么? 一个Python第三方模块,主要用来创建伪数据 无需再手 ...
- redis代替mybatis做缓存
将redis作为缓存 <dependencies> <dependency> <groupId>org.springframework.boot</group ...
- 关于selenium添加使用代理ip
最近在爬某个网站,发现这个网站的反爬太厉害了,正常时候的访问有时候都会给你弹出来验证,验证你是不是蜘蛛,而且requests发的请求携带了请求头信息,cookie信息,代理ip,也能识别是爬虫,他应该 ...
- 从0到1告诉你搭建完整Python+requests接口自动化测试框架!
前言 很多小伙伴不知道什么是框架?框架有哪些东西? 一步步从需求分析到报告生成告诉你如何搭自动化建框架. 学完unittest后这里基本上可以搭建一个简易的项目框架了,我们可以用一条run_main. ...
- FastAPI(38)- 模拟一个跨域场景
同源策略 https://www.cnblogs.com/poloyy/p/15345184.html CORS https://www.cnblogs.com/poloyy/p/15345871.h ...
- Stream聚合函数
Stream班介绍 幼稚园开学的第一天,各们家长把小朋友送到了园里,各位小朋友都你看看我,我看看你.有的嚎啕大哭,有的呆若木鸡....这里时候园长安排我拿来小本本记录入园的小朋友.... 记录小朋友 ...
- 基于深度学习的建筑能耗预测02——安装Tensorflow-gpu
一.检查显卡 ·查看自己的显卡配置是否能支持cuda,以及Tensorflow不同版本要求与CUDA及CUDNN版本对应关系: https://developer.nvidia.com/zh-cn/c ...
- Java基础之(二):Notepad++实现HelloWorld
现在我们开始编写我们的第一个程序:Hello World! HelloWorld 新建一个java文件 文件后缀名为.java Hello.java 代码分析: 接下来写完最大的框之后,那接下来当然就 ...