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]记 ... 
随机推荐
- 【vps搬家】--总结--费元星
			20150310 费元星 稍微玩VPS/服务器比较久的站长手中应该不止一台VPS,我们会有多台机器之间的相互使用.比如可能会遇到的是数据传输,我们传统的做法是先用FTP下载数据A到本地,然后再到本地 ... 
- 初识java atomic
			2018-8-19 昨天看到java.util.concurrent.atomic相关的文章,之前有过留意但并未去了解,正好有空学习一下.本人理解atomic包是concurrent子包,当是为并发所 ... 
- katalon系列七:Katalon Studio全局变量
			假如你有3个脚本都用到了用户名,如果是写死在脚本中,那么需要改变的时候,你需要修改3个地方,我们可以把用户名设为全局变量,在3个脚本中引用,需要修改时只要修改全局变量中的用户名值即可. 在Katalo ... 
- web自动化原理揭秘
			做过两年自动化测试的小伙伴说web自动化测试真的不难,无非就是一些浏览器操作,页面元素操作,常规的情况很容易处理,再学一学特殊元素的处理,基本就能应付项目的测试了. 这个话倒没错,但是真正要学好自动化 ... 
- Resharp使用简记
			一图流: 拾贝: .字符串引号中直接回车键自动添加连接字符串 Ctrl+B:转到定义 Ctr+F11:展示类结构 Ctr+Alt+j:包围代码块 Ctr+\:注释和取消注释 Alt+Ins:重构 Ct ... 
- 使用maven构建web项目(简易版)
			在eclipse中使用maven开发一个web项目 第一步:安装maven:在Windows上安装Maven 中间省略很多步骤....(包括关于eclipse中配置maven) 第二步:不用懂任何ma ... 
- 一道java笔试题
			输入一串用空格隔开的数字串,对于数字串的奇数位按升序排序,偶数位按降序排序. 示例输入: 4 6 2 3 6 7 8 1 处理过程: 奇数位:4 2 6 8 升序排序结果: 2 4 6 8 偶数位:6 ... 
- redis 编译安装错误问题
			编译redis安装的时候报错如下: make[1]: [persist-settings] Error 2 (ignored) CC adlist.o/bin/sh: cc: command not ... 
- 20145214实验五 Java网络编程及安全
			20145214实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我的结对伙伴是 20145219 宋歌,我负责的 ... 
- BluetoothSocket详解
			一. BluetoothSocket简介 1. 简介 客户端与服务端 : BluetoothSocket 和 BluetoothServerSocket 类似于Java中的套接字的 Socket 和 ... 
