Bzoj1176 [Balkan2007]Mokia
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
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3
Sample Output
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的更多相关文章
- [BZOJ1176][Balkan2007]Mokia cdq+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3134 Solved: 1395[Submit][S ...
- BZOJ1176: [Balkan2007]Mokia CDQ分治
最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...
- bzoj1176: [Balkan2007]Mokia【cdq分治】
把询问搞成4个,cdq分治. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a;i <= b; i++) #d ...
- 2018.09.16 bzoj1176: [Balkan2007]Mokia(cdq分治)
传送门 调了半天发现是输出优化打错了求心理阴影体积233 这题很简单啊. 一个修改操作x如果对一个询问操作y有贡献那么有. tx<ty,Xx<=Xy,Yx<=Yy" rol ...
- bzoj千题计划144:bzoj1176: [Balkan2007]Mokia
http://www.lydsy.com/JudgeOnline/problem.php?id=1176 CDQ分治 #include<cstdio> #include<iostre ...
- 【kd-tree】bzoj1176 [Balkan2007]Mokia
裸题不多说,注意在sqrt(n*log(n))次插入后重构树以保持深度. #include<cstdio> #include<cmath> #include<algori ...
- BZOJ1176 [Balkan2007]Mokia 【CDQ分治】
题目 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. 输入格式 ...
- bzoj2683(要改一点代码)&&bzoj1176: [Balkan2007]Mokia
仍然是一道cdq模版.. 那么对于一个询问,容斥一下分成四个,变成问(1,1)~(x,y),那么对于x,y,修改只有x'<=x&&y'<=y,才对询问有影响,那么加上读入顺 ...
- cdq分治入门--BZOJ1176: [Balkan2007]Mokia
对w*w,w<=2000000的矩形,一开始全是0(或一开始全是s),n<=170000个操作,每次操作:矩阵内某点加上一个数,查某一个子矩阵的和,保证修改数<=160000,询问数 ...
随机推荐
- 【转】十个JavaScript中易犯的小错误,你中了几枪?
目录 常见错误一:对于this关键词的不正确引用 常见错误二:传统编程语言的生命周期误区 常见错误三:内存泄露 常见错误四:比较运算符 常见错误五:低效的DOM操作 常见错误6:在for循环中的不正确 ...
- miterLimit和lineJoin属性
<!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>starGirl< ...
- 代替Reflection(反射)的一些方法
Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...
- Ajax中Get请求与Post请求的区别
Get请求和Post请求的区别 1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来 2.使用Get请求发送数据量小,Post请求发送数据量大 例子 页面的HTML代码: &l ...
- Linux(Centos6.5) Nginx 安装
Nginx一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,一个Apache服务器不错的替代品. 能够支持高达 50,000 个并发连接数的响应 ...
- 实战:考虑性能--Solr索引的schema设计
从 high level 的角度来看,schema.xml 结果如下,这个例子虽然不是一个真实的XML,但是简洁明了的传达了shema的概念. <schema> <types> ...
- Oracle索引梳理系列(六)- Oracle索引种类之函数索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- SQL Server 2008 R2——使用计算列为表创建自定义的自增列
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- ORACLE 解锁、找回表和找回程序语句
最近在工作中同事们经常遇到锁表.误删表和程序覆盖的情况,现总结下遇到这三种情况的解决方案: 1.暴力删除锁表 当表被某些语句占用无法停止,或者出现事物阻塞的情况下,需要手动删除锁(万不得已的情况下用) ...
- Oracle Listener 动态注册 与 静态注册
http://blog.csdn.net/tianlesoftware/article/details/5543166