BZOJ2738:矩阵乘法——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2738
Description
给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数。
Input
第一行两个数N,Q,表示矩阵大小和询问组数;
接下来N行N列一共N*N个数,表示这个矩阵;
再接下来Q行每行5个数描述一个询问:x1,y1,x2,y2,k表示找到以(x1,y1)为左上角、以(x2,y2)为右下角的子矩形中的第K小数。Output
对于每组询问输出第K小的数。Sample Input
2 2
2 1
3 4
1 2 1 2 1
1 1 2 2 3Sample Output
1
3
整体二分二维版。
只需要把树状数组变成二维即可。
完后我们就对所有可行的取值二分然后就是整体二分的板子了。
(当然你也可以离散化)
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
const int N=;
const int Q=6e4+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct square{
int val,x,y;
}v[N*N];
bool cmp(square a,square b){
return a.val<b.val;
}
struct question{
int lx,rx,ly,ry,k,id;
}q[Q],tmp1[Q],tmp2[Q];
int ans[Q],tr[N][N];
int n,m,cnt;
inline int lowbit(int t){return t&(-t);}
inline void add(int x,int y,int z){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
tr[i][j]+=z;
}
inline int qry(int x,int y){
int res=;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j))
res+=tr[i][j];
return res;
}
void solve(int L,int R,int l,int r){
if(L>R)return;
if(l==r){
for(int i=L;i<=R;i++)ans[q[i].id]=v[l].val;
return;
}
int idx1=,idx2=,mid=(l+r)>>;
for(int i=l;i<=mid;i++)add(v[i].x,v[i].y,);
for(int i=L;i<=R;i++){
int sum=qry(q[i].rx,q[i].ry)+
qry(q[i].lx-,q[i].ly-)-
qry(q[i].rx,q[i].ly-)-
qry(q[i].lx-,q[i].ry);
if(sum>=q[i].k)tmp1[idx1++]=q[i];
else q[i].k-=sum,tmp2[idx2++]=q[i];
}
for(int i=l;i<=mid;i++)add(v[i].x,v[i].y,-);
int MID=L+idx1;
for(int i=L;i<MID;i++)q[i]=tmp1[i-L];
for(int i=MID;i<=R;i++)q[i]=tmp2[i-MID];
solve(L,MID-,l,mid);solve(MID,R,mid+,r);
return;
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
v[++cnt].val=read();
v[cnt].x=i,v[cnt].y=j;
}
}
sort(v+,v+cnt+,cmp);
for(int i=;i<=m;i++){
q[i].lx=read();q[i].ly=read();
q[i].rx=read();q[i].ry=read();
q[i].k=read();q[i].id=i;
}
solve(,m,,cnt);
for(int i=;i<=m;i++)printf("%d\n",ans[i]);
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ2738:矩阵乘法——题解的更多相关文章
- [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]矩阵乘法-[整体二分+树状数组]
Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. (N<=500,Q<=60000) Solution 考虑二分答案,问题转化为求矩阵内为1 ...
- [BZOJ2738]矩阵乘法 整体二分+二维树状数组
2738: 矩阵乘法 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1643 Solved: 715[Submit][Status][Discuss ...
- 【日常学习】codevs1287 矩阵乘法题解
转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看. 先上题目 题目描写叙述 Description 小明近期在为线性代数而头疼,线性代数确实非 ...
- BZOJ2738: 矩阵乘法(整体二分)
Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N*N个数,表示这个矩阵: ...
- BZOJ2738 矩阵乘法 【整体二分 + BIT】
题目链接 BZOJ2738 题解 将矩阵中的位置取出来按权值排序 直接整体二分 + 二维BIT即可 #include<algorithm> #include<iostream> ...
- 【分块】【链表】bzoj2738 矩阵乘法
http://www.cnblogs.com/jianglangcaijin/p/3460012.html 首先将矩阵的数字排序.设置size,每次将size个数字插入.插入时,我们用h[i][j]记 ...
随机推荐
- 2019年1月23日,好像是这个日子,RF发布了 1.7.3.1 支持python3.6以上了,安装成功。
安装步骤:(win10 家庭版 64) 1.安装Python3.7.2,记得勾选添加Path 2.pip install robotframework 3.pip install wxPython 4 ...
- Siki_Unity_1-5_见缝插针
1-5 见缝插针 任务1:资源下载 任务2:案例演示 任务3:创建工程和场景 Project Name:StickPin import素材,为两张png图 创建各个分类文件夹Scenes/ Prefa ...
- 一段代码-Java
在打算写这么一篇文章的时候,想到很多,觉得要是全都写下来的话,估计BZ也不知道要写多少,总之,好多吧!那么,就让BZ一切从简... 我们知道java它的特殊性在于,用它所写代码的运行是依靠自己的一套j ...
- Oracle作业练习题
第一问 //登陆scott用户 //解锁 alter user scott account unlock; //给用户申请密码 alter user scott identified by tiger ...
- 【input】输入框组件说明
input输入框组件 原型: <input value="[String]" type="[text | number | idcard | digit]" ...
- 【转】: 探索Lua5.2内部实现:虚拟机指令(2) MOVE & LOAD
name args desc OP_MOVE A B R(A) := R(B) OP_MOVE用来将寄存器B中的值拷贝到寄存器A中.由于Lua是register based vm,大部分的指令都是直接 ...
- sql随机数
) as P_jsnews_id ) as P_jsnews_id) * from P_jsnews order by newid()
- 业务迁移---redis
以前也没怎么搞过redis 只知道他是一个nosql数据库很强大,这次迁移用到了~ 正好熟练一下并记录过程,还挺繁琐.. 记录一下在学习中的几个问题,总结加深一下印象,有可能会漏掉或者有误差的地方~ ...
- Log Files
Description Nikolay has decided to become the best programmer in the world! Now he regularly takes p ...
- c#和.net区别
.net 包含两大部分:.net framework类库和公共语言运行库(CLR) .net framework类库,就是微软工程师写好的各种功能类,例如math类. 公共语言运行库:1.与操作系统进 ...