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\) ...
随机推荐
- jsp页面动态获取系统时间
最近在做练习时碰到了这样一个问题:"读者选择查询图书相应信息,跳转到书目的详细信息界面,当可借阅数量大于零,点击借阅按钮,提示用户借阅成功,并显示归还日期(三个月),否则提示用户该书可借阅数 ...
- [PhpStorm]解决Cannot find declaration to go to
1.问题重现 使用单例模式访问类方法,PhpStorm提示类方法Cannot find declaration to go to 2.解决方法 加一句代码注释 注意:注释不能省略变量名 注:成员变量实 ...
- Shell系列(17)- 配置文件功能(待完善)
配置文件功能 文件名 功能 相关联命令 /etc/profile USER变量 LOGNAME变量 MAIL变量 PATH变量 HOSTNAME变量 umask 调用/etc/profile.d/*. ...
- Shell系列(35)- for循环语法一简介及批量解压缩脚本
for循环语法一 for 变量 in 值1 值2 值3 - do 程序 done 例子 需求:批量解压缩 脚本: #!/bin/bash cd /root/publicls *.tar.gz > ...
- python读Excel方法(xlrd)
在我们做平常工作或自动化测试中都会遇到操作excel,Python处理exc相当顺手,如何通过python操作excel,当然python操作excel的库有很多,比如pandas,xlwt/xlrd ...
- Hutool-Convert类型转换常见使用
Convert 主要针对于java中常见的类型转化 java常见类型的转化 转化为字符串 public class HConvert { public static void main(String[ ...
- Java实现完数
完数 找出1-1000以下的完数 public static void main(String[] args) { for(int i=2;i<1000;i++) { int sum=0; fo ...
- 实践node.js构建vue项目
一.首先安装下载node.js 1.Node.js 官方网站下载:https://nodejs.org/en/,自行选择合适自己的下载安装即可 2.验证安装 打开cmd,输入node –v和 npm ...
- vue使用AES.js
AES加密的使用 对数据传输加密.解密处理---AES.js 第一步: 在vue中安装crypto-js依赖 npm install crypto-js --save-dev 第二步: 在static ...
- nodejs 安装 报错解决方案
win10安装nodejs之后,查看版本号在终端输入node -v成功输出版本号,输入npm -v 之后报错...... 反复安装卸载之后,有点奔溃,最后的解决方案是:手动删除"C:\Use ...