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\) ...
随机推荐
- java.lang.SecurityException: MODE_WORLD_READABLE错误解决
问题描述:运行Android项目有以下报错: 解决方法: 把 MODE_WORLD_READABLE 更换成 MODE_PRIVATE 即可,因为MODE_WORLD_READABLE 模式已经被废弃 ...
- 我们也有自带的缓存系统:PHP的APCu扩展
想必大家都使用过 memcached 或者 redis 这类的缓存系统来做日常的缓存,或者用来抗流量,或者用来保存一些常用的热点数据,其实在小项目中,PHP 也已经为我们准备好了一套简单的缓存系统,完 ...
- Docker系列(3)- 配置阿里云镜像加速
step-1 登录阿里云找到容器服务 step-2 找到镜像加速地址 step-3 配置使用 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon ...
- pyqt5设计无边框窗口(一)
import sys from PyQt5 import QtGui,QtCore from PyQt5 import QtCore, QtGui, QtWidgets ############### ...
- Java面向对象编程(二)
关键字 -- this 一.this关键字的使用: 1.this可以用来修饰.调用:属性.方法.构造器. 2.this修饰属性和方法: this理解为:当前对象 或 当前正在创建的对象. 2.1 在类 ...
- Redis的单线程架构
前言 在一定的策略下适度地初始化线程池的线程数有利于提高CPU的利用率,达到高效率地在同一段时间内处理多个任务,最佳的线程数量一般是 最佳线程数=(线程等待的时间与线程CPU执行时间之比+1)*CPU ...
- openlayer 4326与3857坐标互转之Java版
public class Transform { private static final double PI = Math.PI; private static final double merca ...
- Python标准库模块之heapq – 堆构造
Python标准库模块之heapq – 堆构造 读前福利:几百本经典书籍https://www.johngo689.com/2158/ 原文链接:https://www.johngo689.com/2 ...
- Oracle基础命令操作总结
第1章 oracle命令集 1.1 重启数据库 1.1.1 启动数据库 su -root 切换到oracle安装用户下,我的是root source .bash_pro ...
- PHP审计之POP链挖掘
PHP审计之POP链挖掘 前言 续上文中的php反序列化,继续来看,这个POP的挖掘思路.在其中一直构思基于AST去自动化挖掘POP链,迫于开发能力有限.没有进展,随后找到了一个别的师傅已经实现好的项 ...