[Luogu4390][BOI2007]Mokia 摩基亚
题意
支持平面内单点加一个值以及矩阵求和。
平面大小\(W\le2*10^6\),修改操作\(\le1.6*10^5\),查询操作\(\le10^4\)
sol
\(CDQ\)写一发。
把一个询问拆成四个点,类似二维前缀和的形式。这样对于每一个询问,相当于就是问满足\(x_i\le X,y_i\le Y\)的权值和。
树状数组维护即可。
code
#include<cstdio>
#include<algorithm>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 2e6+5;
struct node{
int id,x,y,v,opt;
bool operator < (const node &b) const
{
if (x!=b.x) return x<b.x;
if (y!=b.y) return y<b.y;
return !opt;
}
}p[N],q[N];
int W,n,m,c[N],ans[N];
void modify(int k,int v){while(k<=W)c[k]+=v,k+=k&-k;}
int query(int k){int s=0;while(k)s+=c[k],k-=k&-k;return s;}
void CDQ(int l,int r)
{
if (l==r) return;
int mid=l+r>>1;CDQ(l,mid);CDQ(mid+1,r);
int L=l,R=mid+1;
for (int i=l;i<=r;++i)
if (L<=mid&&(R>r||p[L]<p[R]))
{
q[i]=p[L++];
if (!q[i].opt) modify(q[i].y,q[i].v);
}
else
{
q[i]=p[R++];
if (q[i].opt) ans[q[i].v]+=query(q[i].y)*q[i].opt;
}
for (int i=l;i<=r;++i)
{
p[i]=q[i];
if (p[i].id<=mid&&!p[i].opt) modify(q[i].y,-q[i].v);
}
}
int main()
{
while (233)
{
int opt=gi();
if (opt==0) W=gi();
if (opt==1)
{
int x=gi(),y=gi(),v=gi();
p[++n]=(node){n,x,y,v,0};
}
if (opt==2)
{
int x1=gi(),y1=gi(),x2=gi(),y2=gi();
++m;
if (x1>1&&y1>1) p[++n]=(node){n,x1-1,y1-1,m,1};
if (x1>1) p[++n]=(node){n,x1-1,y2,m,-1};
if (y1>1) p[++n]=(node){n,x2,y1-1,m,-1};
p[++n]=(node){n,x2,y2,m,1};
}
if (opt==3) break;
}
CDQ(1,n);
for (int i=1;i<=m;++i) printf("%d\n",ans[i]);
return 0;
}
[Luogu4390][BOI2007]Mokia 摩基亚的更多相关文章
- 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告
P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...
- 【BZOJ1176】[BOI2007]Mokia 摩基亚
[BZOJ1176][BOI2007]Mokia 摩基亚 题面 bzoj 洛谷 题解 显然的\(CDQ\)\(/\)树套树题 然而根本不想写树套树,那就用\(CDQ\)吧... 考虑到点\((x1,y ...
- [BOI2007]Mokia 摩基亚
Description: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫 ...
- cogs1752[boi2007]mokia 摩基亚 (cdq分治)
[题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...
- P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...
- [BOI2007]Mokia 摩基亚(CDQ分治)
upd:\((x1,y1)(x2,y2)\)表示以\((x1,y1)\)为左上端点 \((x2,y2)\)为右下端点的矩形 本来以为是一道二位树状数组的模板,但是看数据范围之后就放弃了,边界既然到了2 ...
- P4390 [BOI2007]Mokia 摩基亚(cdq分治)
一样是cdq的板子 照着园丁的烦恼就好了 代码 #include <cstdio> #include <cstring> #include <algorithm> ...
- 【cdq分治】【P4390】[BOI2007]Mokia 摩基亚
Description 给你一个 \(W~\times~W\) 的矩阵,每个点有权值,每次进行单点修改或者求某子矩阵内权值和,允许离线 Input 第一行是两个数字 \(0\) 和矩阵大小 \(W\) ...
- [洛谷P4390][BOI2007]Mokia 摩基亚
题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...
随机推荐
- 【JavaScript】写代码前的准备
1.搭建开发环境,编辑器推荐HBuilder,浏览器用谷歌. 2.编写一个HelloWorld程序. HelloWorld.html <!DOCTYPE html> <html> ...
- jQuery双向滑动杆 设置数值百分比
在线演示 本地下载
- 什么是MSB/LSB码?
MSB是Most Significant Bit的缩写,最高有效位.在二进制数中,MSB是最高加权位.与十进制数字中最左边的一位类似.通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧. L ...
- Windows 10 调节缩略图背景透明度
A goal is a dream with a deadline. Much effort, much prosperity. 用Windows 10 的朋友都知道 win10 确实挺好用,但是做的 ...
- 数据结构(二) 树Tree
五.树 树的定义 树的逻辑表示:树形表示法.文氏图表示法.凹入表示法.括号表示法. 结点:表示树中的元素,包括数据项及若干指向其子树的分支. 结点的度:结点拥有的子树树:树的度:一 ...
- 一图看懂join、left join、right join、fulljoin间的区别
INNER JOIN 关键字在表中存在至少一个匹配时返回行. LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配.如果右表中没有匹配,则结果为 NULL. ...
- Mac 使用技巧分享
1. 快捷键开启speech功能: System Preferences -> Ditaction&Speech ->Text to Speech ->Select 'Spe ...
- “玲珑杯”ACM比赛 Round #13 B -- 我也不是B(二分排序)
题意:开始有一个空序列s,一个变量c=0,接着从左往右依次将数组a中的数字放入s的尾部,每放一个数字就检测一次混乱度K,当混乱度k大于M时就清空序列并让c=c+1 K = Bi * Vi(1<= ...
- JavaWeb -- Struts1 动态bean, 动态校验, 动态生成javascript 表单校验
1. 动态formbean. 表单 JSP: <%@ page language="java" import="java.util.*" pageEnco ...
- 用Java编程计算出所有的"水仙花数"
题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个 "水仙花数 ",因 ...