Mokia 摩基亚
题目链接:[https://www.luogu.com.cn/problem/P4390]
快捷版题意:
维护一个\(W*W\)的矩阵,初始值均为\(S\).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数\(M<=160000\),询问数\(Q<=10000,W<=2000000.\)
思路:
第一反应二维树状数组,然而看到\(W<=2000000\)便望而却步。
想到今天在练\(cdq\)分治,于是往这个方向靠。
首先,容易想到子矩阵总权值可拆分为四个前缀子矩阵权值和。
那么,前缀子矩阵权值和权值和怎么求呢?
初始值\(S\)直接加就可以了。
考虑到一个修改操作对求和有贡献,当且仅当它在需要求的前缀子矩阵内部。
设前缀子矩阵右下角坐标为\((x,y)\),则对于对其有贡献的点P,满足\(xp<=x\)且\(yp<=y\)
发现这原来就是一个裸的三维偏序,上cdq分治即可。
注意事项:
- 树状数组查询时可能会有0,要特判一下。
- 数组要开大些,因为一个询问会被分裂长四个。
- 还有变量名不要手残打错。
code:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+50;
const int W=2e6+50;
int s,w,n;
struct node{int x,y,v,tp,id,ans;}a[N],b[N];
bool operator<(node x,node y){return x.x<y.x;}
inline int read()
{
int s=0,w=1; char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')w=-1;
for(;isdigit(ch);ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
return s*w;
}
struct tree{
int c[W];
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int v)
{
if(!x) return;
for(;x<=w;x+=lowbit(x))c[x]+=v;
}
inline int query(int x)
{
if(!x) return 0;
int ans=0;
for(;x;x-=lowbit(x))ans+=c[x];
return ans;
}
}T;
void cdq(int l,int r)
{
if(l==r) return;
int mid=l+r>>1;
cdq(l,mid);cdq(mid+1,r);
sort(b+l,b+mid+1);sort(b+mid+1,b+r+1);
int i=l,j=mid+1;
for(;j<=r;++j)
{
for(;i<=mid&&b[i].x<=b[j].x;++i)
if(b[i].tp==1) T.add(b[i].y,b[i].v);
if(b[j].tp==2)
a[b[j].id].ans+=T.query(b[j].y);
}
for(int e=l;e<i;++e)
if(b[e].tp==1) T.add(b[e].y,-b[e].v);
}
int main()
{
s=read(),w=read();
while(7)
{
int opt=read();
if(opt==3) break;
if(opt==1)
a[++n].x=read(),a[n].y=read(),a[n].v=read(),a[n].tp=1,a[n].id=n;
else
{
int x11=read(),y11=read(),x22=read(),y22=read();
a[++n].x=x22,a[n].y=y22,a[n].tp=2,a[n].id=n;
a[++n].x=x11-1,a[n].y=y22,a[n].tp=2,a[n].id=n;
a[++n].x=x22,a[n].y=y11-1,a[n].tp=2,a[n].id=n;
a[++n].x=x11-1,a[n].y=y11-1,a[n].tp=2,a[n].id=n;
}
}
for(int i=1;i<=n;++i) b[i]=a[i];
cdq(1,n);
for(int i=1;i<=n;++i)
if(a[i].tp==2)
{
int bas=abs(a[i+1].x-a[i+2].x)*abs(a[i+1].y-a[i+2].y)*s;
printf("%d\n",bas+a[i].ans-a[i+1].ans-a[i+2].ans+a[i+3].ans);
++i,++i,++i;
}
return 0;
}
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\) ...
- [Luogu4390][BOI2007]Mokia 摩基亚
luogu 题意 支持平面内单点加一个值以及矩阵求和. 平面大小\(W\le2*10^6\),修改操作\(\le1.6*10^5\),查询操作\(\le10^4\) sol \(CDQ\)写一发. 把 ...
- [洛谷P4390][BOI2007]Mokia 摩基亚
题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...
随机推荐
- sass快速使用
sass的使用 建议使用一种语法格式(scss) scss sass转换 sass-convert main.scss main.sass sass变量声明 example: $headline-ff ...
- 怎样在python中写注释
python中的注释是以井号: # 开头, 一般会在#后加一个空格. # This is a comment print("Hello, World!") 多行注释的语法是三引号: ...
- hdu 5432
Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...
- 路由基础(Routing)
查看本机路由表: [root@controller02 ~]# cat /etc/iproute2/rt_tables # # reserved values # 255 local 254 ...
- 多线程使用libcurl
curl默认情况下有两个地方是线程不安全的, 需要特殊处理, 1是curl_global_init 这个函数必须单线程调用, 2是默认多线程调用https会莫名其妙的挂掉, 以下是网上的解决方案 ht ...
- 命令“regsvr32 /s /n /i:user "XXXXXX"”已退出,代码为 3
问题:命令“regsvr32 /s /n /i:user "F:\XXXXXXXXXXXXXXXXX\Release\One.ocx"”已退出,代码为 3 解决方法: The is ...
- 一、ribbon如何集成在openfeign中使用
所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 ribbon是springcloud封装的一个基于http客户端负载均衡的组件.spri ...
- 调试location指令时,直接让location输出文本
有时候我们调试location指令时希望location指令能够直接输出文本,这样能够方便我们进行调试.这时我们可以使用echo模块实现,但是大多数情况我们没有安装这个模块,那么我们还可以使用另一个方 ...
- mongodb 备份与还原操作
环境信息: 版本: mongodb 3.2 备份: mongodump 恢复: mongorestore 本文参考官方文档:https://docs.mongodb.com/manual/refere ...
- BHD钱包部署【生态池/合作池】
前序 BHD网址:https://btchd.org/#wallet 注:我这里是centos7, 所以我选linuxPC 部署 解压与配置 tar -zxf bhd-v1.3.4.0-d909c0e ...