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,询问数 ...
随机推荐
- MVC3.0----整理之一
1.ViewBag对象是动态解析对象 @{ ViewBag.Title = "Insert"; } 不仅可以把单个的对象绑定到 ViewBag上,还可以直接绑定List ViewB ...
- Maven基础配置—本地Maven配置
1.下载客户端 通过http://maven.apache.org/download.cgi#下载Maven本地客户端. 我下载的是apache-maven-3.2.5-bin.zip,在D盘解压. ...
- 用EF访问Centos下的MySQL
环境 : MySQL 5.6.21 64位 CentOS 6.5 64位 VMware 10 Navicat for MySQL 11 VS2013 1.首先搭建centos 的MySQL开发环境 : ...
- SQL SERVER导出特殊格式的平面文件
有时候我们需要将SQL SERVER的数据一次性导入到ORACLE中,对于数据量大的表.我一般习惯先从SQL SERVER导出特殊格式的平面文件(CSV或TXT),然后用SQL*Loader装载数据到 ...
- sql 日期格式汇总
SQLserver中用convert函数转换日期格式2008-01-15 15:51SQLserver中用convert函数转换日期格式 SQL Server中文版的默认的日期字段datetime格式 ...
- Java虚拟机栈
Java Virtual Machine Stacks,线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型:每一个方法执行的同时都会创建一个栈帧(Stack Frame),由于存储局部变 ...
- URLEncoder.encode 和 URLDecoder.decode 处理url的特殊参数
在使用 url 的 queryString 传递参数时,因为参数的值,被DES加密了,而加密得到的是 Base64的编码字符串,类似于: za4T8MHB/6mhmYgXB7IntyyOUL7Cl++ ...
- 深入解析SQL Server并行执行原理及实践(上)
在成熟领先的企业级数据库系统中,并行查询可以说是一大利器,在某些场景下他可以显著的提升查询的相应时间,提升用户体验.如SQL Server, Oracle等, Mysql目前还未实现,而Postgre ...
- Jsoup做接口测试
最早用Jsoup是有一个小的爬虫应用要写,发现Jsoup较HttpClient轻便多了,API也方便易懂,上手很快,对于response的Document解析的选择器用的是cssSelector(Jq ...
- ElasticSearch集群设置
多台机器 \config\elasticsearch.yml 文件修改 cluster.name设置统一的集群名如 cluster.name: win-es-001 node.name 设置当前Nod ...