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 ...
随机推荐
- Oracle每10天删除数据,并重建索引
declare datDateFrom date := to_date('2010/08/01 00:00:00','yyyy/mm/dd hh24:mi:ss'); datDateTo date; ...
- 折腾ghost。。。
1.启动 NODE_ENV=production node index.js 如果出现启动不了的情况,在该命令加sudo sudo NODE_ENV=production node index.js ...
- Sql 解释
SQL(Structured Query Language) 结构化查询语言,虽然是查询语言,也是一种编程语言,但是执行查询操作. 根据数据的操作对象,可以将SQL语句分为几类. DDL(Data D ...
- 17_JSP_入门
[JSP简述] JSP全称是Java Server Pages,它和Servlet技术一样,都是一种用于开发动态Web页面的技术. * html页面:用html写的页面 * JSP页面:用html写页 ...
- About 'atoi'
在很多地方我们看到的都是:atoi 是一个 C Reference function atoi() convert a string to an integer. This function of s ...
- 生产者消费者问题c语言实现
#include <stdio.h> #include <process.h> #include <Windows.h> //信号量与关键段 CRITICAL_SE ...
- JS的词法作用域
词法作用域定义实现的规则: 1 函数作用域实在定义的时候决定的,而不是在执行时候决定 2 为了实现这种词法作用域,函数内部不仅包含函数代码逻辑,还必须引用当前的作用域链. 3 函数对象可以通过作用域链 ...
- 初识jQuery(适合初学者哟.........)
您要知道!! jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库. 微软公司甚至把jQuery作为他们的官方库.对 ...
- HttpWebRequest中的KeepAlive
一直不是非常理解.NET中HttpWebRequest的KeepAlive属性有何用处,看了这篇文章就清楚了! http://www.cnblogs.com/lwzz/archive/2011/08/ ...
- oracle,wamp,FZ突然出现问题,求解决方案(未解决,最终系统还原)
-----背景------- 系统:win7 64位oracle 11g(11.1)每天都用oracle.用toad for oracle .电脑固定IP.未更改任何配置信息.用了几个月,突然出现了 ...