bzoj1176 2683
我的第一道cdq分治题
清明做了一下cdq分治的几道题,感觉这个东西实在是太厉害了
离线大法好!关于几个经典的非数据结构做法具体可以看xhr神犇2013年的论文
应用cdq分治的前提条件是不强制在线,修改操作互不影响。
什么是互相影响,比如在第i个数后面插入一个数,这就明显是会影响到后面的操作
在这个前提条件下,我们可以按照操作序列的时间线(先后)划分成两个规模缩小一半的子问题
显然后面的修改对前面无影响,而后半部分的修改对后半部分的询问、前半部分对前半部分的询问是子问题,可以递归解决
所以下面我们只要解决前半部分的所有修改操作对后半部分询问答案的贡献即可
注意这里其实就相当于给出初始值不断进行无修改询问
也就是我们通过分治(1个log的代价,根据主定理可知),干掉了动态修改
回到这题上来,由于矩阵很大,不能支持二维数据结构,并且满足前提条件,所以用cdq分治
之后就变成了给定矩阵上一些值,求子矩阵和这样一个无修改的问题
注意这里询问满足减法性质,于是可以拆成四个询问,很显然对x排序,对y维护树状数组即可
具体做法间见程序注释(如果已经懂得了分治的框架写起来是非常轻松的)
注意bzoj1176和2683空间和范围略有不同
type node=record
op,ch,w,x,y:longint;
end; var c:array[..] of longint;
a,q:array[..] of node;
ans:array[..] of longint;
ch,pre,i,n,m,x,y,x1,y1,t:longint; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; function cmp(a,b:node):boolean; //注意这里要三个关键字排序,x,y,修改优先,为什么要自己想想
begin
if a.x<b.x then exit(true)
else if a.x=b.x then
begin
if a.y<b.y then exit(true)
else if (a.y=b.y) and (a.op<b.op) then exit(true);
end;
exit(false);
end; procedure swap(var a,b:node);
var c:node;
begin
c:=a;
a:=b;
b:=c;
end; procedure sort(l,r:longint);
var i,j:longint;
x:node;
begin
i:=l;
j:=r;
x:=q[(l+r) shr ];
repeat
while cmp(q[i],x) do inc(i);
while cmp(x,q[j]) do dec(j);
if not(i>j) then
begin
swap(q[i],q[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; procedure add(x,w:longint);
begin
while x<=t do
begin
inc(c[x],w);
x:=x+lowbit(x);
end;
end; function ask(x:longint):longint;
begin
ask:=;
while x> do
begin
ask:=ask+c[x];
x:=x-lowbit(x);
end;
end; procedure cdq(l,r:longint);
var m,i,l1,l2:longint;
begin
if l=r then exit;
m:=(l+r) shr ;
for i:=l to r do
begin
if (q[i].ch<=m) and (q[i].op=-) then add(q[i].y,q[i].w); //前半部分修改
if (q[i].ch>m) and (q[i].op<>-) then inc(ans[q[i].w],ask(q[i].y)*q[i].op); //对后半部分查询影响
end;
for i:=l to r do //树状数组清0
if (q[i].ch<=m) and (q[i].op=-) then add(q[i].y,-q[i].w);
l1:=l; l2:=m+;
for i:=l to r do //按时间划分操作序列
if q[i].ch<=m then
begin
a[l1]:=q[i];
inc(l1);
end
else begin
a[l2]:=q[i];
inc(l2);
end; for i:=l to r do
q[i]:=a[i];
cdq(l,m);
cdq(m+,r);
end; begin
readln(pre,t);
while true do
begin
read(ch);
if ch= then break;
if ch= then
begin
inc(m);
q[m].ch:=m;
readln(q[m].x,q[m].y,q[m].w);
q[m].op:=-;
end
else begin
inc(n); inc(m);
readln(x,y,x1,y1);
q[m].w:=n; q[m].ch:=m; q[m].x:=x1; q[m].y:=y1; q[m].op:=;
inc(m);
q[m].w:=n; q[m].ch:=m; q[m].x:=x-; q[m].y:=y1; q[m].op:=-;
inc(m);
q[m].w:=n; q[m].ch:=m; q[m].x:=x1; q[m].y:=y-; q[m].op:=-;
inc(m);
q[m].w:=n; q[m].ch:=m; q[m].x:=x-; q[m].y:=y-; q[m].op:=;
end;
end;
sort(,m);
cdq(,m);
for i:= to n do
writeln(ans[i]);
end.
bzoj1176 2683的更多相关文章
- 【BZOJ-1176&2683】Mokia&简单题 CDQ分治
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组
bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
- [BZOJ2683]简单题/[BZOJ1176][BalkanOI2007]Mokia
[BZOJ2683]简单题 题目大意: 一个\(n\times n(n\le5\times10^5)\)的矩阵,初始时每个格子里的数全为\(0\).\(m(m\le2\times10^5)\)次操作, ...
- bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
- 【BZOJ1176】[Balkan2007]Mokia/【BZOJ2683】简单题 cdq分治
[BZOJ1176][Balkan2007]Mokia Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=1600 ...
- 【BZOJ1176】Mokia(CDQ分治)
[BZOJ1176]Mokia(CDQ分治) 题面 BZOJ权限题啊,,,, dbzoj真好 Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的 ...
- 【BZOJ1176】[BOI2007]Mokia 摩基亚
[BZOJ1176][BOI2007]Mokia 摩基亚 题面 bzoj 洛谷 题解 显然的\(CDQ\)\(/\)树套树题 然而根本不想写树套树,那就用\(CDQ\)吧... 考虑到点\((x1,y ...
- bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...
随机推荐
- TLF相关资料
1\(转)http://blog.csdn.net/hu36978/article/details/5796165 TFL 一般先创建TextFlow 通过控制flowComposer属性来控制文本 ...
- 24种设计模式--中介者模式【Mediator Pattern】
各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...
- 读书笔记-JavaScript中的全局对象
对于任何JavaScript程序,当程序开始运行时,JavaScript解释器都会初始化一个全局对象以供程序使用.这个JavaScript自身提供的全局对象的功能包括: 1.全局对象拥有一些常用的属性 ...
- tar解压去除文件夹
tar zxvf test.tar.gz --strip-components 1 解压到当前目录,并去除一级目录
- 转:testlink 环境搭建(傻瓜版)
testlink 环境搭建(傻瓜版) 2011-11-24 22:23 by 虫师, 12322 阅读, 4 评论, 收藏, 编辑 今天抽了点时间把testlink 环境搭建了一下,一直觉得这东西不怎 ...
- android:Faild to install,你的主机中的软件终止了一个连接错误解决
当在用真机调试android程序时出现Faild to install,你的主机中的软件终止了一个连接错误时可以这样解决: 在手机开启usb调试和安装未知来源软件的情况下: 1:先查进入任务管理器查看 ...
- UIWebView 加载网页、文件、 html-b
UIWebView 是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过al ...
- poj 1631 Bridging signals (二分||DP||最长递增子序列)
Bridging signals Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9234 Accepted: 5037 ...
- RWD
http://webdesignerwall.com/tutorials/responsive-design-with-css3-media-queries http://www.webdesigns ...
- POJ 3007 Organize Your Train part II(哈希链地址法)
http://poj.org/problem?id=3007 题意 :给你一个字符串,让你无论从什么地方分割,把这个字符串分成两部分s1和s2,然后再求出s3和s4,让你进行组合,看能出来多少种不同的 ...