BZOJ 2738 矩阵乘法(整体二分+二维树状数组)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2738
【题目大意】
给出一个方格图,询问要求求出矩阵内第k小的元素
【题解】
我们对答案的大小进行整体二分,用二维树状数组维护二维区间和,
将超过数量的分治到左区间,不满足的分治到右区间即可。
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=250010,M=510;
namespace Td_BIT{
int c[M][M];
void Initialize(){memset(c,0,sizeof(c));}
void add(int x,int y,int val){
for(int i=x;i<M;i+=i&-i)
for(int j=y;j<M;j+=j&-j)c[i][j]+=val;
}
int query(int x,int y){
int res=0;
for(int i=x;i;i-=i&-i)
for(int j=y;j;j-=j&-j)res+=c[i][j];
return res;
}
}
struct Q{int x1,x2,y1,y2,k;}q[N];
struct data{int x,y,val;}a[N];
bool operator<(data a,data b){return a.val<b.val;}
int cnt;
int query(int k){
using namespace Td_BIT;
int x1=q[k].x1,y1=q[k].y1,x2=q[k].x2,y2=q[k].y2;
return query(x2,y2)+query(x1-1,y1-1)-query(x1-1,y2)-query(x2,y1-1);
}
int mark[N],ans[N],id[N],tmp[N],T=0;
void solve(int l,int r,int L,int R){
if(l>r||L==R)return;
int mid=(L+R)>>1;
while(a[T+1].val<=mid&&T<cnt){Td_BIT::add(a[T+1].x,a[T+1].y,1);T++;}
while(a[T].val>mid){Td_BIT::add(a[T].x,a[T].y,-1);T--;}
int cnt=0;
for(int i=l;i<=r;i++){
if(query(id[i])>q[id[i]].k-1){
mark[i]=1;
ans[id[i]]=mid;
cnt++;
}else mark[i]=0;
}int l1=l,l2=l+cnt;
for(int i=l;i<=r;i++){
if(mark[i])tmp[l1++]=id[i];
else tmp[l2++]=id[i];
}for(int i=l;i<=r;i++)id[i]=tmp[i];
solve(l,l1-1,L,mid);solve(l1,l2-1,mid+1,R);
}
int n,m;
int main(){
scanf("%d%d",&n,&m);
int mx=cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[++cnt].x=i; a[cnt].y=j;
scanf("%d",&a[cnt].val);
mx=max(a[cnt].val,mx);
}
}sort(a+1,a+cnt+1);
for(int i=1;i<=m;i++)scanf("%d%d%d%d%d",&q[i].x1,&q[i].y1,&q[i].x2,&q[i].y2,&q[i].k);
for(int i=1;i<=m;i++)id[i]=i;
solve(1,m,0,mx+1);
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}
BZOJ 2738 矩阵乘法(整体二分+二维树状数组)的更多相关文章
- BZOJ.2738.矩阵乘法(整体二分 二维树状数组)
题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...
- 【bzoj2738】矩阵乘法 整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...
- BZOJ2738矩阵乘法——整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...
- [BZOJ2738]矩阵乘法 整体二分+二维树状数组
2738: 矩阵乘法 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1643 Solved: 715[Submit][Status][Discuss ...
- [BZOJ2738]矩阵乘法(整体二分+二维树状数组)
整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...
- BZOJ 2738 子矩阵第k大 | 二维树状数组 整体二分 分治
BZOJ 2738 "矩阵乘法"(子矩阵第k大) 题意 给出一个矩阵,多次询问子矩阵中第k大的数是多少. 题解 我做这道题之前先照着这道题出了一道题,是这道题的一维版本,在这里:h ...
- 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)
试题来源 2012中国国家集训队命题答辩 问题描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入格式 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共 ...
- BZOJ 2738: 矩阵乘法 [整体二分]
给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 愚蠢的名字...... 整体二分,影响因子就是矩阵里的数 把$\le mid$的矩阵元素加到二维树状数组里然后询问分成两组就行 ...
- BZOJ 1452 Count 【模板】二维树状数组
对每种颜色开一个二维树状数组 #include<cstdio> #include<algorithm> using namespace std; ; ][maxn][maxn] ...
随机推荐
- Java 扑克牌发牌
今天看到这个算法题,http://www.cnblogs.com/xishuai/p/3392981.html ,忍不住自己用Java做了一个. 初始化很重要,所有的52张牌按顺序放入到容器里边,标志 ...
- printk %pF %pS含义【转】
作者:啐楼链接:https://www.zhihu.com/question/37769890/answer/73532192来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- Linux 内核通知链随笔【中】【转】
转自:http://blog.chinaunix.net/uid-23069658-id-4364171.html 关于内核通知链不像Netlink那样,既可以用于内核与用户空间的通信,还能用于内核不 ...
- java的equal和==问题
看一本比较简略的java教程,在看到对象的时候,书上直接给我来一句: 刚看下觉得没什么问题,很有道理的一个东东嘛,但是出于习惯还是打了几行代码测试了一下,代码如下: class Person { pr ...
- Aspxgridview 根据条件来自定义计算Totalsummery
protected void ASPxGridView1_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEven ...
- HA集群
//硬件准备: .两个机器,相同系统 .网卡ip为:aming 192.168.11.24 aming1 192.168.11.23 //实验准备: . hostname : aming , amin ...
- jstorm系列-2:入门
有了基本的概念之后,我们用jstorm来做一点小事情吧 做一个很无聊的事情:给定一个时间戳,输出对应的问候语 规则是:时间戳的十位对应的数字对应不同的时间段,0-2代表早上,3代表中午,4-6代表下午 ...
- BZOJ 1010 玩具装箱toy(斜率优化DP)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题目大意:P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他 ...
- opencv中矩阵计算的一些函数
转自:http://blog.sina.com.cn/s/blog_7908e1290101i97z.html 综述: OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口 ...
- 数据库之存储过程(Stored Procedure)【未完待续】
存储过程(Stored Procedure,以下简称SP)是啥?有什么用?优缺点? 一个SP是一段存储在数据库系统中的一条或多条sql语句的集合,类似一条批处理,它能被触发器,或者其他的SP以及APP ...