[BZOJ2738]矩阵乘法

题面

给你一个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

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

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

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

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

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

思路

整体二分。

对于每个查询操作,我们只需要判断整个矩阵内小于mid的元素个数然后即可分类递归。因为对于整体二分,所有的初始值都是以插入操作的形式完成的。所以我们用二维树状数组记录所有权值小于\(mid\)的元素组成的矩阵(矩阵大小不变,大于\(mid\)的数用0代替)。这样我们就可以使用二维树状数组来计算一个子矩阵的大小了。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 550
#define inf (int)(1e9+1000)
#define maxsize maxn*maxn+65000
int c[maxn][maxn];
struct gg{int ty,ux,uy,dx,dy,k,id;
}q[maxsize],q1[maxsize],q2[maxsize];
int n,m,cnt,ans[maxsize];
inline int low(int x){return x&-x;}
void add(int x,int y,int num){for(int i=x;i<=n;i+=low(i)){for(int j=y;j<=n;j+=low(j)){c[i][j]+=num;}}
}
int get(int x,int y){int sum=0;for(int i=x;i>=1;i-=low(i)){for(int j=y;j>=1;j-=low(j)){sum+=c[i][j];}}return sum;
}
int query(int ux,int uy,int dx,int dy){return get(dx,dy)-get(dx,uy-1)-get(ux-1,dy)+get(ux-1,uy-1);
}
void solve(int l,int r,int L,int R){if(l>r||L>R){return;}if(l==r){for(int i=L;i<=R;i++){if(q[i].ty==1){ans[q[i].id]=l;}}return;}int mid=(l+r)>>1;int cnt1=0,cnt2=0;for(int i=L;i<=R;i++){if(q[i].ty){int tmp=query(q[i].ux,q[i].uy,q[i].dx,q[i].dy);if(q[i].k<=tmp){q1[++cnt1]=q[i];}else{q[i].k-=tmp;q2[++cnt2]=q[i];}}else{if(q[i].k<=mid){add(q[i].ux,q[i].uy,1);q1[++cnt1]=q[i];}else{q2[++cnt2]=q[i];}
}}for(int i=1;i<=cnt1;i++){if(!q1[i].ty)add(q1[i].ux,q1[i].uy,-1);}for(int i=1;i<=cnt1;i++){q[L+i-1]=q1[i];}for(int i=1;i<=cnt2;i++){q[L+i+cnt1-1]=q2[i];}solve(l,mid,L,L+cnt1-1);solve(mid+1,r,L+cnt1,R);return;
}
int main(){//freopen("in","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){q[++cnt]=(gg){0,i,j,i,j};scanf("%d",&q[cnt].k);}}for(int i=1;i<=m;i++){int a[10];scanf("%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5]);q[++cnt]=(gg){1,a[1],a[2],a[3],a[4],a[5],i};}solve(-inf,inf,1,cnt);for(int i=1;i<=m;i++){printf("%d\n",ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/GavinZheng/p/10910927.html

[BZOJ2738]矩阵乘法相关推荐

  1. BZOJ2738: 矩阵乘法(整体二分)

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

  2. BZOJ2738 矩阵乘法 【整体二分 + BIT】

    题目链接 BZOJ2738 题解 将矩阵中的位置取出来按权值排序 直接整体二分 + 二维BIT即可 #include<algorithm> #include<iostream> ...

  3. 【BZOJ2738】矩阵乘法 [整体二分][树状数组]

    矩阵乘法 Time Limit: 20 Sec  Memory Limit: 256 MB [Submit][Status][Discuss] Description 给你一个N*N的矩阵,不用算矩阵 ...

  4. 如何在CPU上优化GEMM矩阵乘法

    如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...

  5. CPU的自动调度矩阵乘法

    CPU的自动调度矩阵乘法 这是一个有关如何对CPU使用自动调度程序的文档. 与依靠手动模板定义搜索空间的基于模板的autotvm不同,自动调度程序不需要任何模板.用户只需要编写计算声明,而无需任何调度 ...

  6. 十个利用矩阵乘法解决的经典题目

    出自matrix67.com 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.     不要以为数学 ...

  7. [学习笔记]矩阵乘法及其优化dp

    1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...

  8. ICML 2021:矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在不做乘 ...

  9. 大佬是怎么优雅实现矩阵乘法的?

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨立交桥跳水冠军 来源丨https://zhuanlan.zhi ...

最新文章

  1. c#算两个火星坐标的距离(高德or百度)
  2. Makefile的补充学习
  3. 天地伟业tiandy如何连手机_关注 | 天地盖手工盒裱纸选铜版纸还是白牛皮纸?
  4. 达尔文进化奖_使用Kydavra GeneticAlgorithmSelector将达尔文进化应用于特征选择
  5. 游标定位:Cursor类
  6. linux 双通道 磁盘,HP MSA2012SA 双通道 磁盘阵列配置说明 for linuxoracle
  7. 计算机主机和cpu的区别,服务器CPU和普通电脑CPU有什么区别?
  8. socketserver 模块的构成
  9. jQuery中find和filter的区别
  10. djangobook的旧版本代码,关于数据库
  11. python网络爬虫基础知识
  12. python纵向输出字符串,python-字符串方法,格式化输出
  13. Linux服务器恢复删除数据
  14. 使用VMware虚拟机通过Panabit抓取爱快虚拟机PPPoE报文
  15. 完爆面试官!2021Java高频精选面试题讲解
  16. 搭建个人博客【搭建Hexo+Fluid博客并部署到GitHub/云服务器(阿里云/腾讯云)】
  17. H3C模拟器2012鼎杰终极版的基本使用教程
  18. 劝人自杀情绪多变,人工智能真不是个“东西”
  19. 实时监控linux的日志命令
  20. C#之敲击回车键触发Button的Click事件

热门文章

  1. oracle 容器切换,oracle12c 多租户管理四(容器连接切换)
  2. python连接mongo数据库
  3. java 面试题三十三 子类父类方法执行顺序的问题
  4. spring json
  5. 中文pppoe中文拨号的解决方案
  6. 《剑指offer》求1+2+3+...n(不用if、else、乘除等)
  7. 有向图的深度和广度遍历
  8. python科学计算笔记(十三)pandas的merge、concat合并数据集
  9. 梯度与梯度下降法详解
  10. 【offer去哪了】我一连面试了十个Java岗,统统石沉大海!