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. shell 强大的awk

    from here 小用法,使用awk来对文件随机抽取n行 awk 'BEGIN{srand()} {print rand()"\t"$0}' input_file | sort ...

  2. linux 下 git gem 等代理设置问题

    github.com,作为程序员的代码仓库,我们经常会用到.但有时候我们不能直接通过网络链接它,只能通过代理. 这里我有一台代理服务器,起初我以为在终端设置了代理环境就行了,其设置为在你的~/.bas ...

  3. 1.border-image

    1.设置在元素围绕的border的图片,用图片代替边框 语法: broder-image-source:图片 border-image-slice:切下的区域,数字|百分比(相对于图像的高度和宽度) ...

  4. 自定义事件类EventManager (TS中...args的使用例子)

    一个自定义事件类 初衷是使用Egret的事件有两点比较麻烦 1   在事件处理函数时,需要从e中获取data hander(e:egret.Event){ let data = e.data; } 2 ...

  5. angular -- ng-ui-route路由及其传递参数?page页面版

    前面有说过 ng-ui-route 使用 script 标签来做,但是很多时候,会通过引入模板页面的方式来实现: 具体代码: <!DOCTYPE html> <html lang=& ...

  6. C语言实现日历输出

    这个还是挺实用的.... 头文件: #ifndef MAIN_H #define MAIN_H #include "stdio.h" #include "math.h&q ...

  7. JQueryUI之Autocomplete

    JQueryUI之Autocomplete JQuery UI 是以 JQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画.特效和可更换主题的可视控件,这些控件 ...

  8. Object 对象有哪些方法?

    这个不看还真不一定能说全,请养成良好的阅读源码和JDK文档的习惯. 总结一下:一共11个,wait的3个+notify的2个,hashCode和equals还有toString共3个,然后clone和 ...

  9. Spring Security使用心得

    某天,你的客户提出这样一个需求,在点击购买商品的时,如果用户没有注册,并且用户没有账号,这时用户去创建账户,然后要直接返回到想购买商品的付款页面.你会该如何基于Spring Security实现? S ...

  10. PL/SQL编程基础(四):程序控制(IF,CASE,FOR,LOOP,WHILE LOOP,EXIT,CONTINUE)

    程序控制 程序结构有分支结构与循环结构: 分支结构语法:IF.CASE: 循环结构:FOR.WHILE LOOP:先执行再判断,至少执行一次: WHILE LOOP:先判断再执行,如果不满足条件,就不 ...