题目链接:[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 摩基亚的更多相关文章

  1. 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告

    P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...

  2. 【BZOJ1176】[BOI2007]Mokia 摩基亚

    [BZOJ1176][BOI2007]Mokia 摩基亚 题面 bzoj 洛谷 题解 显然的\(CDQ\)\(/\)树套树题 然而根本不想写树套树,那就用\(CDQ\)吧... 考虑到点\((x1,y ...

  3. [BOI2007]Mokia 摩基亚

    Description: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫 ...

  4. cogs1752[boi2007]mokia 摩基亚 (cdq分治)

    [题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...

  5. P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)

    题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...

  6. [BOI2007]Mokia 摩基亚(CDQ分治)

    upd:\((x1,y1)(x2,y2)\)表示以\((x1,y1)\)为左上端点 \((x2,y2)\)为右下端点的矩形 本来以为是一道二位树状数组的模板,但是看数据范围之后就放弃了,边界既然到了2 ...

  7. P4390 [BOI2007]Mokia 摩基亚(cdq分治)

    一样是cdq的板子 照着园丁的烦恼就好了 代码 #include <cstdio> #include <cstring> #include <algorithm> ...

  8. 【cdq分治】【P4390】[BOI2007]Mokia 摩基亚

    Description 给你一个 \(W~\times~W\) 的矩阵,每个点有权值,每次进行单点修改或者求某子矩阵内权值和,允许离线 Input 第一行是两个数字 \(0\) 和矩阵大小 \(W\) ...

  9. [Luogu4390][BOI2007]Mokia 摩基亚

    luogu 题意 支持平面内单点加一个值以及矩阵求和. 平面大小\(W\le2*10^6\),修改操作\(\le1.6*10^5\),查询操作\(\le10^4\) sol \(CDQ\)写一发. 把 ...

  10. [洛谷P4390][BOI2007]Mokia 摩基亚

    题目大意: 维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值. 题解:CDQ分治,把询问拆成四个小矩形 卡点:无 C++ Code: #include <cstdio& ...

随机推荐

  1. PAT甲级题分类汇编——树

    本文为PAT甲级分类汇编系列文章. AVL树好难!(其实还好啦~) 我本来想着今天应该做不完树了,没想到电脑里有一份讲义,PPT和源代码都有,就一遍复习一遍抄码了一遍,更没想到的是编译一遍通过,再没想 ...

  2. go String接口方法

    该接口经常用于输出 struct 的值 或者记录struct数据日志 一个普遍存在的接口是 fmt 包中定义的 Stringer接口 发现 http://tour.studygolang.com/me ...

  3. uwsgi flask gevent 测试代码覆盖率(coverage)

    目录 可能出现的问题 解决 可能出现的问题 多进程启动 gevent启动 运行的服务可能不会停止 解决 我先参考了一下这一篇文章使用Coverage分析WSGI项目的代码覆盖率,他基本能够解决掉1.2 ...

  4. Fiddler讲解2

    想要 浏览更多Fiddler内容:请点击进入Fiddler官方文档 阅读目录: 一.查看网络流量: 二.检查网络流量: 三.查看Web会话摘要: 四.查看Web会话统计信息: 五.查看Web会话内容: ...

  5. PB Event ID 含义 内容浅析

    Event ID 含义 内容浅析 event可以用pb自带的id,自动触发事件,而function就需要你去调用了,返回值多种多样 单选或多选按钮消息(前缀:pbm_bm) pbm_bmgetchec ...

  6. Spring Cloud Alibaba学习笔记(14) - Spring Cloud Stream + RocketMQ实现分布式事务

    发送消息 在Spring消息编程模型下,使用RocketMQ收发消息 一文中,发送消息使用的是RocketMQTemplate类. 在集成了Spring Cloud Stream之后,我们可以使用So ...

  7. java 读取文件流

    搬运自速学堂:https://www.sxt.cn/Java_jQuery_in_action/ten-iqtechnology.html JAVA中IO流体系: 四大IO抽象类 ·InputStre ...

  8. flutter入门之常见的flutter问题汇总(转)

    1. 使用AppBar后如何去掉左边的返回箭头.左边的图标对应的是leading,源代码如下(吐槽一下,CSDN暂不支持dart语言): Widget leading = widget.leading ...

  9. Privacy Description

    This application respects and protects the privacy of all users who use the service. In order to pro ...

  10. MySQL索引机制详解(B+树)

    一.索引是什么? 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 二.为什么要使用索引? 索引能极大的减少存储引擎需要扫描的数据量. 索引可以把随机IO变成顺序IO. 索引可以帮助我 ...