bzoj2738
感人肺腑pascal过不去系列,跪求开O2
先不说这个了,学完cdq分治之后又顺手学了一下整体二分
感觉这两个东西很多相似的地方,干脆都叫cdq分治好了
二分解决k小就是设当前二分的答案为m,把x<=m的标为1,统计区间和,如果大于等于k,说明答案小于等于m,否则大于m
其实仔细想想主席树就是方便干这个事,但这题主席树?总觉得有点虚
什么叫整体二分,就是二分答案,把答案能<=m归为1类,另外归为一类,划分成子问题继续解决(分治的策略)
统计和可以用二维树状数组
还是由于没开O2和pascal跑得慢,实在弄不过去,有算法上优化的话欢迎指教
代码仅供参考,因为TLE……
type node=record
x,y,v:longint;
end;
point=record
x0,y0,x1,y1,k:longint;
end; var q:array[..] of point;
ans,d,c:array[..] of longint;
v:array[..] of boolean;
a:array[..] of node;
w:array[..] of longint;
b:array[..,..] of longint;
mx,n,m,i,j,k,p:longint; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; procedure add(x,y,w:longint);
var p:longint;
begin
p:=x;
while y<=n do
begin
x:=p;
while x<=n do
begin
inc(b[x,y],w);
x:=x+lowbit(x);
end;
y:=y+lowbit(y);
end;
end; function ask(x,y:longint):longint;
var p:longint;
begin
ask:=; p:=x;
while y> do
begin
x:=p;
while x> do
begin
ask:=ask+b[x,y];
x:=x-lowbit(x);
end;
y:=y-lowbit(y);
end;
end; function check(i:longint):boolean;
var s:longint;
begin
s:=ask(q[i].x1,q[i].y1);
if s<q[i].k then exit(false);
s:=s-ask(q[i].x0-,q[i].y1);
if s<q[i].k then exit(false);
s:=s+ask(q[i].x0-,q[i].y0-);
if s<q[i].k then exit(false);
s:=s-ask(q[i].x1,q[i].y0-);
if s>=q[i].k then exit(true) else 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,x:longint;
begin
i:=l;
j:=r;
x:=a[(l+r) shr ].v;
repeat
while a[i].v<x do inc(i);
while x<a[j].v do dec(j);
if not(i>j) then
begin
swap(a[i],a[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 work(f,t,l,r:longint);
var m,p,l1,l2:longint;
begin
// writeln(f,' ',r,' ',l,' ',r);
if f>t then exit;
if l>r then exit;
m:=(l+r) shr ;
while (j<k) and (a[j+].v<=m) do
begin
add(a[j+].x,a[j+].y,);
inc(j);
end;
while (j>) and (a[j].v>m) do
begin
add(a[j].x,a[j].y,-);
dec(j);
end;
p:=;
for i:=f to t do
if check(c[i]) then
begin
inc(p);
ans[c[i]]:=m;
v[i]:=true;
end
else v[i]:=false; l1:=f; l2:=f+p;
for i:=f to t do
if v[i] then
begin
d[l1]:=c[i];
inc(l1);
end
else begin
d[l2]:=c[i];
inc(l2);
end;
for i:=f to t do c[i]:=d[i];
work(l1,t,m+,r);
work(f,l1-,l,m-);
end; begin
readln(n,m);
for i:= to n do
for j:= to n do
begin
inc(k);
a[k].x:=i;
a[k].y:=j;
read(a[k].v);
end;
sort(,k);
p:=;
w[]:=a[].v;
a[].v:=;
for i:= to k do
begin
if w[p]<>a[i].v then
begin
inc(p);
w[p]:=a[i].v;
end;
a[i].v:=p;
end;
for i:= to m do
begin
with q[i] do readln(x0,y0,x1,y1,k);
c[i]:=i;
end;
j:=;
work(,m,,p);
for i:= to m do
writeln(w[ans[i]]);
end.
bzoj2738的更多相关文章
- BZOJ2738 矩阵乘法 【整体二分 + BIT】
题目链接 BZOJ2738 题解 将矩阵中的位置取出来按权值排序 直接整体二分 + 二维BIT即可 #include<algorithm> #include<iostream> ...
- 【BZOJ2738】矩阵乘法 整体二分
[BZOJ2738]矩阵乘法 Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列 ...
- [bzoj2738]矩阵乘法_整体二分_树状数组
矩阵乘法 bzoj-2738 题目大意:给定一个$n*n$的矩阵.每次给定一个矩阵求矩阵$k$小值. 注释:$1\le n\le 500$,$1\le q\le 6\cdot 10^4$. 想法: 新 ...
- BZOJ2738: 矩阵乘法
Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N*N个数,表示这个矩阵: ...
- BZOJ2738矩阵乘法——整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...
- BZOJ2738 矩阵乘法(整体二分+树状数组)
单个询问二分答案即可,多组询问直接整体二分再二维BIT.注意保证复杂度. #include<iostream> #include<cstdio> #include<cma ...
- [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...
- bzoj千题计划150:bzoj2738: 矩阵乘法
http://www.lydsy.com/JudgeOnline/problem.php?id=2738 整体二分 二维树状数组累积 #include<cstdio> #include&l ...
- [BZOJ2738]矩阵乘法-[整体二分+树状数组]
Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. (N<=500,Q<=60000) Solution 考虑二分答案,问题转化为求矩阵内为1 ...
随机推荐
- css 利用border属性制作箭头 Using Borders to Make Pure CSS Arrows
不再需要多余的图片 用border属性自然能创造箭头效果 学习地址:http://tech.patientslikeme.com/2010/11/09/using-borders-to-make-pu ...
- 学习C++ Primer 的个人理解(二)
本身就一定基础的读者我想变量常量这些概念应该已经不是问题了.但是本章还是有几个重点,需要特别留意一下的: 1.初始化和赋值是不同的操作 2.任何非0值都是true 3.使用新标准列表初始化,在有丢失精 ...
- 当在Win8下安装msi类型的文件出现errorcode 2503的解决方法
Win8安装程序出现2502.2503错误解决方法 在Win8中,在安装msi安装包的时候常常会出现代码为2502.2503的错误.其实这种错误是由于安装权限不足造成的,可以这种msi的安装包不像其他 ...
- thinkphp表单上传文件并将文件路径保存到数据库中
上传单个文件,此文以上传图片为例,上传效果如图所示 创建数据库upload_img,用于保存上传路径 CREATE TABLE `seminar_upload_img` ( `id` int(11) ...
- js中的referrer返回上一页使用介绍
js中的referrer的用法举例. js完整代码: <script language="javascript"> var refer=document.refer ...
- PHP联合sqlserver2008使用的全过程 ( 原创 亲测)
一.环境 php5.2.5 sqlserver2008 win7 二.配置PHP 1.打开php.in将extension=php_mssql.dll的注释符号去掉. 2.打开php.in将mssql ...
- fsockopen
fsockopen — 打开一个网络连接或者一个Unix套接字连接 说明 resource fsockopen ( string $hostname [, int $port = -1 [, int ...
- oracle LogMiner配置使用
一.安装LogMiner1.@D:\app\product\11.1.0\db_1\RDBMS\ADMIN\dbmslm.sql 2.@D:\app\product\11.1.0\db_1\RDBMS ...
- python学习_应用pickle模块封装和拆封数据对象
学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...
- 安装使用adobe_photoshop_cs6
1.先断开网络,安装官方原版PS程序. 2.在安装程序界面选择“试用”安装. 3.等安装完成后,退出程序. 4.复制破解补丁到安装路径覆盖,如:D:\Program Files\Adobe\Adobe ...