Description

维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.

Input

第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小
接下来每行为一下三种输入之一(不包含引号):
"1 x y a"
"2 x1 y1 x2 y2"
"3"
输入1:你需要把(x,y)(第x行第y列)的格子权值增加a
输入2:你需要求出以左下角为(x1,y1),右上角为(x2,y2)的矩阵内所有格子的权值和,并输出
输入3:表示输入结束

Output

对于每个输入2,输出一行,即输入2的答案

Sample Input

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output

3
5
 
时隔五个月再做这道题又有新的理解
首先把操作看成四个二维前缀和相加减,然后对于每个操作有三个维度:时间,$x$轴,$y$轴
考虑对一个查询,哪些修改操作会对它产生影响,当且仅当在它之前发生且在它的左下方
所以我们可以按照$x$轴先排序消除$x$轴的影响
然后对归并排序时间戳使得左右两部分的操作有序
然后按时间戳加入修改和询问就完成了
代码:
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M 2000010
using namespace std;
int read() {
char ch=getchar();int x=;
while(ch>''||ch<'') ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x;
}
int n,S,tot,qcnt,tim;
int ans[M],f[M];
struct ASK{int t,x,y,w,ot,id;}q[M],tmp[M];
bool cmp(ASK a1,ASK a2) {
if(a1.x!=a2.x) return a1.x<a2.x;
if(a1.y!=a2.y) return a1.y<a2.y;
return a1.id<a2.id;
}
void add(int loc,int v) {
for(int i=loc;i<=n;i+=(i&-i)) f[i]+=v;
}
int query(int loc) {
int ans=;
for(int i=loc;i;i-=(i&-i)) ans+=f[i];
return ans;
}
void CDQ(int l,int r) {
if(l==r) return;
int mid=(l+r)>>;
CDQ(l,mid);CDQ(mid+,r);
int t1=l,t2=mid+,now=l;
while(t1<=mid||t2<=r) {
if(t1<=mid&&q[t1].t<q[t2].t||t2>r) {
if(q[t1].ot==) add(q[t1].y,q[t1].w);
tmp[now++]=q[t1++];
}
else {
if(q[t2].ot==) ans[q[t2].id]+=q[t2].w*query(q[t2].y);
tmp[now++]=q[t2++];
}
}
for(int i=l;i<=mid;i++)
if(q[i].ot==)
add(q[i].y,-q[i].w);
for(int i=l;i<=r;i++) q[i]=tmp[i];
}
int main() {
S=read();n=read();
while() {
int opt=read();
if(opt==) break;
if(opt==) {
int x=read(),y=read(),z=read();
q[++tot]=(ASK){++tim,x,y,z,};
}
else {
int x1=read(),y1=read(),x2=read(),y2=read();
ans[++qcnt]=(x2-x1+)*(y2-y1+)*S;
q[++tot]=(ASK){++tim,x1-,y1-,,,qcnt};
q[++tot]=(ASK){++tim,x2,y2,,,qcnt};
q[++tot]=(ASK){++tim,x1-,y2,-,,qcnt};
q[++tot]=(ASK){++tim,x2,y1-,-,,qcnt};
}
}
sort(q+,q++tot,cmp);
CDQ(,tot);
for(int i=;i<=qcnt;i++) printf("%d\n",ans[i]);
return ;
}

[BZOJ1176]Mokia的更多相关文章

  1. [bzoj1176]Mokia[CDQ分治]

    啃了一天论文,发现CDQ分治的原理其实很简单,大概就是这样的一类分治:将左右区间按一定规律排序后分开处理,递归到底时直接计算答案,对于一个区间,按照第二关键字split成两个区间,先处理左区间,之后因 ...

  2. BZOJ1173 CDQ分治 笔记

    目录 二维数据结构->cdq 预备知识 T1: 二维树状数组 T2:cdq分治 bzoj1176 mokia:Debug心得 一类特殊的CDQ分治 附: bzoj mokia AC代码 二维数据 ...

  3. CDQ分治&整体二分学习个人小结

    目录 小结 CDQ分治 二维LIS 第一道裸题 bzoj1176 Mokia bzoj3262 陌上花开 bzoj 1790 矩形藏宝地 hdu5126四维偏序 P3157 [CQOI2011]动态逆 ...

  4. [BZOJ2683]简单题/[BZOJ1176][BalkanOI2007]Mokia

    [BZOJ2683]简单题 题目大意: 一个\(n\times n(n\le5\times10^5)\)的矩阵,初始时每个格子里的数全为\(0\).\(m(m\le2\times10^5)\)次操作, ...

  5. 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治

    [BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...

  6. 【BZOJ1176】Mokia(CDQ分治)

    [BZOJ1176]Mokia(CDQ分治) 题面 BZOJ权限题啊,,,, dbzoj真好 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的 ...

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

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

  8. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  9. 【BOI2007】【BZOJ1176】Mokia

    1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MB Submit: 1059 Solved: 432 [Submit][St ...

随机推荐

  1. Mahout实现基于用户的协同过滤算法

    Mahout中对协同过滤算法进行了封装,看一个简单的基于用户的协同过滤算法. 基于用户:通过用户对物品的偏好程度来计算出用户的在喜好上的近邻,从而根据近邻的喜好推测出用户的喜好并推荐. 图片来源 程序 ...

  2. 基于TINY4412的Andorid开发-------简单的LED灯控制

    参考资料: <Andriod系统源代码情景分析> <嵌入式Linux系统开发完全手册_基于4412_上册> 作者:彭东林 邮箱:pengdonglin137@163.com 平 ...

  3. 不同linux下两网卡绑定方法

    记得原来在做性能测试时,为了提高网络吞吐率.必须将两个网卡绑定一起工作.绑定方法如下: 一.CentOS 配置   1.编辑虚拟网络接口配置文件,指定网卡IP: # vi /etc/sysconfig ...

  4. Thrift入门之mac下的安装流程

    新建一个maven项目,先下载maven依赖  http://thrift.apache.org/download <dependency> <groupId>org.apac ...

  5. mysql : show processlist 详解

    最近排查一些MySQL的问题,会经常用到 show processlist,所以在这里把这个命令总结一下,做个备忘,以备不时只需. 首先是几条常用的SQL. 1.按客户端 IP 分组,看哪个客户端的链 ...

  6. SQL---->mySQl数据库1------表内容的增删改查

    增: insert into user(id,username,birthday,entry_date,job,salary,resume) values(1,'aaaa','1995-12-10', ...

  7. Oracle 的闪回技术 --flashback

    SQL Fundamentals: 表的创建和管理 如何开启数据库闪回? SQL> shutdown immediate; ORA-01109: database not open Databa ...

  8. python之sys.stdout、sys.stdin以及设置打印到日志文件等

    转自:https://www.cnblogs.com/BigFishFly/p/6622784.html python之sys.stdout.sys.stdin 转自:http://www.cnblo ...

  9. 关于mysql5.7的一些变化

    最近接了个项目,使用的数据库是5.7的,开始没太在意,但是在接手的过程中发送了些小插曲,特意记录下来. 首先,我想自己安装个noinstall版本的,结果发信下载下来的和之前版本的不一样,没有data ...

  10. jQuery至上宝典

    一 jQuery是什么? <1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. <2>jQuery是继 ...