2738: 矩阵乘法

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 1643  Solved: 715
[Submit][Status][Discuss]

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 3

Sample Output

1
3

HINT

  矩阵中数字是109以内的非负整数;

  20%的数据:N<=100,Q<=1000;

  40%的数据:N<=300,Q<=10000;

  60%的数据:N<=400,Q<=30000;

  100%的数据:N<=500,Q<=60000。

先将矩阵中所有元素排序,然后对于所有询问一起二分

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,q;
struct tmp {
int v,x,y;
bool operator <(const tmp &t)const {
return v<t.v;
}
}a[];
int cnt=;
struct data {
int x1,y1,x2,y2,k,id,ans;
}ask[],s[];
int sum[][];
int lowbit(int x){return x&(-x);}
void update(int x,int y,int add) {
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j)) sum[i][j]+=add;
}
int query(int x,int y) {
int an=;
for(int i=x;i>;i-=lowbit(i))
for(int j=y;j>;j-=lowbit(j)) an+=sum[i][j];
return an;
}
int get(int x1,int y1,int x2,int y2) {
return query(x2,y2)+query(x1-,y1-)-query(x1-,y2)-query(x2,y1-);
}
void solve(int l,int r,int ql,int qr) {
if(ql>qr) return;
if(l==r) {
for(int i=ql;i<=qr;i++) ask[i].ans=a[l].v;
return ;
}
int mid=(l+r)>>;
for(int i=l;i<=mid;i++) update(a[i].x,a[i].y,);
int head=ql-,tail=;
for(int i=ql;i<=qr;i++) {
int nowk=get(ask[i].x1,ask[i].y1,ask[i].x2,ask[i].y2);
if(nowk>=ask[i].k) ask[++head]=ask[i];
else {s[++tail]=ask[i];s[tail].k-=nowk;}
}
for(int i=;i<=tail;i++) ask[++head]=s[i];
for(int i=l;i<=mid;i++) update(a[i].x,a[i].y,-);
solve(l,mid,ql,qr-tail);
solve(mid+,r,qr-tail+,qr);
return ;
}
bool cmp(data t1,data t2) {
return t1.id<t2.id;
}
int main() {
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){scanf("%d",&a[++cnt].v);a[cnt].x=i;a[cnt].y=j;}
sort(a+,a+cnt+);
for(int i=;i<=q;i++) {
scanf("%d%d%d%d%d",&ask[i].x1,&ask[i].y1,&ask[i].x2,&ask[i].y2,&ask[i].k);
ask[i].id=i;
}
solve(,cnt,,q);
sort(ask+,ask++q,cmp);
for(int i=;i<=q;i++) printf("%d\n",ask[i].ans);
}

[BZOJ2738]矩阵乘法 整体二分+二维树状数组的更多相关文章

  1. BZOJ2738矩阵乘法——整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入   第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...

  2. 【bzoj2738】矩阵乘法 整体二分+二维树状数组

    题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5个数 ...

  3. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  4. [BZOJ2738]矩阵乘法(整体二分+二维树状数组)

    整体二分+二维树状数组. 好题啊!写了一个来小时. 一看这道题,主席树不会搞,只能用离线的做法了. 整体二分真是个好东西,啥都可以搞,尤其是区间第 \(k\) 大这种东西. 我们二分答案,然后用二维树 ...

  5. BZOJ 2738 矩阵乘法(整体二分+二维树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2738 [题目大意] 给出一个方格图,询问要求求出矩阵内第k小的元素 [题解] 我们对答 ...

  6. 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)

    试题来源 2012中国国家集训队命题答辩 问题描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入格式 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共 ...

  7. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分

    题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...

  8. 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]

    题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...

  9. 洛谷P1527 矩阵乘法——二维树状数组+整体二分

    题目:https://www.luogu.org/problemnew/show/P1527 整体二分,先把所有询问都存下来: 然后二分一个值,小于它的加到二维树状数组的前缀和里,判断一遍所有询问,就 ...

随机推荐

  1. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告----------------------------------------------------------------------------------------- ...

  2. Windows下python 3 pip程序升级异常问题及pip常用命令

    最近在学习,Selenium+Python自动化,在安装selenium包的时候,出现无法安装的情况,并提示Pip有新的版本,我的版本太低了.然后安装系统提示操作,pip升级也出现异常,报错timeo ...

  3. input()报错:TypeError: '>=' not supported between instances of 'str' and 'int'

    今天学习python基础—分支与循环,接触到了if.在练习一个if语句的时候,出现了错误. 题目是: 根据分数划分成四个级别:优秀.良好.及格.不及格,分数是72: grade = 72if grad ...

  4. websocket+nodejs+redis实现消息订阅和发布系统

    其实我很懒,不想打字,代码已上传到码云,请点此处. 有疑问请一下扫描二维码,加我微信:

  5. 1020 Tree Traversals (25 分)(二叉树的遍历)

    给出一个棵二叉树的后序遍历和中序遍历,求二叉树的层序遍历 #include<bits/stdc++.h> using namespace std; ; int in[N]; int pos ...

  6. 软工实践Beta冲刺前装备

    过去存在的问题 组员之间缺乏沟通,前后端缺乏沟通协作 组员积极性不高 基础知识不够扎实 手动整合代码效率过低 我们已经做了哪些调整/改进 通过会议加强组员之间的交流 组长请喝了奶茶提高大家积极性 努力 ...

  7. kafka-0.9消费者新API

    ## kafka-0.9消费者新API 注:以下仅限kafka版本0.9以上Consumer新版api Consumer自动提交示例: Properties props = new Propertie ...

  8. BZOJ 1861: [Zjoi2006]Book 书架 | SPlay 板题

    #include<cstdio> #include<algorithm> #include<cstring> #define N 80010 #define whi ...

  9. IE6对!important单个的类是支持的

    "!important"是什么? 第一个,是设置样式的优先级,设了!important的样式的属性优先于id选择器和class选择器.,比如id为"Main"的 ...

  10. SecureCRT配置设置

    颜色设置   参考: http://blog.csdn.net/zklth/article/details/8937905 配置导入.导出   参考: http://jingyan.baidu.com ...