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. MySQL的数据库与表格创建

    打开MySQL: 1.进入终端输入:cd /usr/local/mysql/bin/ 2.回车后 登录管理员权限 sudo su 3.回车后输入以下命令来禁止mysql验证功能 ./mysqld_sa ...

  2. linux 学习随笔-shell基础知识

    1:用户的shell历史命令保存在home/username/.bash_history中 #!!  执行用户的上一条命令 #!pw  执行命令历史中最近一次以pw开头的命令 2:'*'来匹配零或多个 ...

  3. MySQL frm+ibd文件还原data的办法【数据恢复】

    MySQL frm+ibd文件还原data的办法[数据恢复] 此方法只适合innodb_file_per_table          = 1 当误删除ibdata 该怎么办? 如下步骤即可恢复: 1 ...

  4. oracle 使用 dbms_lock.sleep暂停存储过程执行

    grant execute on dbms_lock to USERNAME;   dbms_lock.sleep(time)参数单位为秒   create or replace procedure ...

  5. LeetCode#11. Container With Most Water

    问题描述 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ...

  6. x01.os.20: compile linux-0.11 on the ubuntu

    为什么学习 linux 正如不能依靠美国的 GPS 为我们的导弹指示目标一样,很难想像用运行 windows 的电脑去同美国进行信息战.而朝鲜的网络崩溃,再次警示国人,信息战.网络战离我们并不遥远.l ...

  7. mybatis配置-返回date类型丢失时间

    此博客仅作于平时开发所遇到的问题记录,不做他用,描述可能不好,自己看懂即可~~ resultMap配置返回时间类型时,发现数据库时间是精确到秒的,但是返回给javabean之后丢失时分秒的信息,只有日 ...

  8. python学习笔记-python程序运行

    小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...

  9. 【2016-10-27】【坚持学习】【Day14】【VS 配置管理器 AssemblyInfo 】

    有这样一个需求,不同客户,有不同的逻辑,通过配置管理器和条件编译进行 自动执行正确的代码.

  10. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...