Time Limit: 30 Sec  Memory Limit: 162 MB
Submit: 2000  Solved: 890

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

HINT

保证答案不会超过int范围

Source

CDQ分治

 #include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define LL long long
using namespace std;
const int mxn=;
inline int read(){
int sum=,flag=;char ch=getchar();
while(ch!='-'&&(ch>''||ch<''))ch=getchar();
if(ch=='-'){flag=-;ch=getchar();}
while(ch<=''&&ch>=''){sum=sum*+ch-'';ch=getchar();}
return sum*flag;
}
int n;
int t[mxn];
struct opt{
int flag,ti;int x,y,a;int id;
}a[mxn];
int cnt=,ict=;
LL ans[mxn];
int cmp(opt a,opt b){
return (a.x<b.x || (a.x==b.x && a.ti<b.ti));
}
inline void add(int x,int v){
while(x<=n){t[x]+=v;x+=x&-x;}
}
inline int ask(int x){
int res=;
while(x){res+=t[x];x-=x&-x;}
return res;
}
opt p[mxn];
void solve(int l,int r){
if(l>=r)return;
int mid=(l+r)>>;
int l1=l,l2=mid+;
for(int i=l;i<=r;i++){
if(a[i].flag== && a[i].ti<=mid)add(a[i].y,a[i].a);
else if(a[i].flag== && a[i].ti>mid) ans[a[i].id]+=ask(a[i].y)*a[i].a;
}
for(int i=l;i<=r;i++)if(a[i].flag== && a[i].ti<=mid)add(a[i].y,-a[i].a);
for(int i=l;i<=r;i++){
if(a[i].ti<=mid) p[l1++]=a[i];
else p[l2++]=a[i];
}
for(int i=l;i<=r;i++)a[i]=p[i];
solve(l,mid);solve(mid+,r);
return;
}
int main(){
int i,j,S;
S=read();n=read();
int op,X1,Y1,X2,Y2,w;
while(){
op=read();
if(op==)break;
if(op==){
X1=read();Y1=read();w=read();
a[++cnt].x=X1;a[cnt].y=Y1;a[cnt].a=w;a[cnt].flag=;a[cnt].ti=cnt;
}
else{
X1=read()-;Y1=read()-;X2=read();Y2=read();
a[++cnt].x=X1;a[cnt].y=Y1;a[cnt].a=;a[cnt].flag=;a[cnt].ti=cnt;a[cnt].id=++ict;
a[++cnt].x=X1;a[cnt].y=Y2;a[cnt].a=-;a[cnt].flag=;a[cnt].ti=cnt;a[cnt].id=ict;
a[++cnt].x=X2;a[cnt].y=Y1;a[cnt].a=-;a[cnt].flag=;a[cnt].ti=cnt;a[cnt].id=ict;
a[++cnt].x=X2;a[cnt].y=Y2;a[cnt].a=;a[cnt].flag=;a[cnt].ti=cnt;a[cnt].id=ict;
ans[ict]=(X2-X1)*(Y2-Y1)*S;
}
}
sort(a+,a+cnt+,cmp);
solve(,cnt);
for(i=;i<=ict;i++){
printf("%lld\n",ans[i]);
}
return ;
}

Bzoj1176 [Balkan2007]Mokia的更多相关文章

  1. [BZOJ1176][Balkan2007]Mokia cdq+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 1395[Submit][S ...

  2. BZOJ1176: [Balkan2007]Mokia CDQ分治

    最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...

  3. bzoj1176: [Balkan2007]Mokia【cdq分治】

    把询问搞成4个,cdq分治. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a;i <= b; i++) #d ...

  4. 2018.09.16 bzoj1176: [Balkan2007]Mokia(cdq分治)

    传送门 调了半天发现是输出优化打错了求心理阴影体积233 这题很简单啊. 一个修改操作x如果对一个询问操作y有贡献那么有. tx<ty,Xx<=Xy,Yx<=Yy" rol ...

  5. bzoj千题计划144:bzoj1176: [Balkan2007]Mokia

    http://www.lydsy.com/JudgeOnline/problem.php?id=1176 CDQ分治 #include<cstdio> #include<iostre ...

  6. 【kd-tree】bzoj1176 [Balkan2007]Mokia

    裸题不多说,注意在sqrt(n*log(n))次插入后重构树以保持深度. #include<cstdio> #include<cmath> #include<algori ...

  7. BZOJ1176 [Balkan2007]Mokia 【CDQ分治】

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

  8. bzoj2683(要改一点代码)&&bzoj1176: [Balkan2007]Mokia

    仍然是一道cdq模版.. 那么对于一个询问,容斥一下分成四个,变成问(1,1)~(x,y),那么对于x,y,修改只有x'<=x&&y'<=y,才对询问有影响,那么加上读入顺 ...

  9. cdq分治入门--BZOJ1176: [Balkan2007]Mokia

    对w*w,w<=2000000的矩形,一开始全是0(或一开始全是s),n<=170000个操作,每次操作:矩阵内某点加上一个数,查某一个子矩阵的和,保证修改数<=160000,询问数 ...

随机推荐

  1. Html--表单练习

          <!--文档定义一定要带上,因为浏览器在解析的时候先按照文档定义的格式解析,   如果没有就按照浏览器默认的格式解析,可能会出问题.-->   <html>   & ...

  2. SQL Server 2008 R2——用CTE进行递归计算求解累计值

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  3. Java IO工作机制分析

    Java的IO类都在java.io包下,这些类大致可分为以下4种: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 ...

  4. 【2016-10-28】【坚持学习】【Day15】【Oracle】【变量 定义 使用】

    declare i integer ; j ; begin i :; dbms_output.put_line(j); end

  5. 理解ThreadLocal(之二)

    想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...

  6. BZOJ 3343: 教主的魔法 [分块]【学习笔记】

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discus ...

  7. 洛谷P1119 灾后重建[Floyd]

    题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...

  8. NYOJ 734

    奇数阶魔方 描述 一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方.n为奇数时我们有1种构造方法,叫做“右上方” ,例如下面给出n=3,5,7 ...

  9. MyBatis入门案例、增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  10. Java中Array.sort()的几种用法(需要初始化要排序的对象)

    ====================================================== 1.Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且 ...