题目链接

BZOJ2738

题解

将矩阵中的位置取出来按权值排序

直接整体二分 + 二维BIT即可

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstdio>
  4. #define LL long long int
  5. #define REP(i,n) for (int i = 1; i <= (n); i++)
  6. #define lbt(x) (x & -x)
  7. using namespace std;
  8. const int maxn = 300005,maxm = 100005,INF = 0x3f3f3f3f;
  9. inline int read(){
  10. int out = 0,flag = 1; char c = getchar();
  11. while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
  12. while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
  13. return flag ? out : -out;
  14. }
  15. struct node{int x,y,v;}e[maxn];
  16. struct Que{int x1,y1,x2,y2,k,id;}q[maxn],t[maxn];
  17. int b[maxn],bi,N,Q,n,tot,ans[maxn],s[505][505];
  18. void add(int x,int y,int v){
  19. for (int i = x; i <= n; i += lbt(i))
  20. for (int j = y; j <= n; j += lbt(j))
  21. s[i][j] += v;
  22. }
  23. int query(int x,int y){
  24. int re = 0;
  25. for (int i = x; i; i -= lbt(i))
  26. for (int j = y; j; j -= lbt(j))
  27. re += s[i][j];
  28. return re;
  29. }
  30. int sum(int x1,int y1,int x2,int y2){
  31. return query(x2,y2) - query(x2,y1 - 1) - query(x1 - 1,y2) + query(x1 - 1,y1 - 1);
  32. }
  33. inline bool operator <(const node& a,const node& b){
  34. return a.v < b.v;
  35. }
  36. void solve(int l,int r,int L,int R){
  37. if (L > R) return;
  38. if (l == r){
  39. for (int i = L; i <= R; i++) ans[q[i].id] = e[l].v;
  40. return;
  41. }
  42. int mid = l + r >> 1,li = L,ri = R,v;
  43. for (int i = l; i <= mid; i++) add(e[i].x,e[i].y,1);
  44. for (int i = L; i <= R; i++){
  45. v = sum(q[i].x1,q[i].y1,q[i].x2,q[i].y2);
  46. if (v >= q[i].k) t[li++] = q[i];
  47. else q[i].k -= v,t[ri--] = q[i];
  48. }
  49. for (int i = L; i <= R; i++) q[i] = t[i];
  50. for (int i = l; i <= mid; i++) add(e[i].x,e[i].y,-1);
  51. solve(l,mid,L,li - 1); solve(mid + 1,r,ri + 1,R);
  52. }
  53. int main(){
  54. n = read(); Q = read();
  55. REP(i,n) REP(j,n) e[++N] = (node){i,j,b[++bi] = read()};
  56. REP(i,Q) q[i].x1 = read(),q[i].y1 = read(),q[i].x2 = read(),q[i].y2 = read(),q[i].k = read(),q[i].id = i;
  57. sort(b + 1,b + 1 + bi); tot = 1;
  58. for (int i = 2; i <= bi; i++) if (b[i] != b[tot]) b[++tot] = b[i];
  59. REP(i,N) e[i].v = lower_bound(b + 1,b + 1 + tot,e[i].v) - b;
  60. sort(e + 1,e + 1 + N);
  61. solve(1,N,1,Q);
  62. REP(i,Q) printf("%d\n",b[ans[i]]);
  63. return 0;
  64. }

BZOJ2738 矩阵乘法 【整体二分 + BIT】的更多相关文章

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

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

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

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

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

    Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. (N<=500,Q<=60000) Solution 考虑二分答案,问题转化为求矩阵内为1 ...

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

    2738: 矩阵乘法 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1643  Solved: 715[Submit][Status][Discuss ...

  5. 【BZOJ2738】矩阵乘法 整体二分

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

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

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

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

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

  8. BZOJ 2738: 矩阵乘法 [整体二分]

    给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 愚蠢的名字...... 整体二分,影响因子就是矩阵里的数 把$\le mid$的矩阵元素加到二维树状数组里然后询问分成两组就行 ...

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

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

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

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

随机推荐

  1. 一文让您全面了解清楚HBase数据库的所有知识点,值得收藏!

    一.HBase基本概念:列式数据库 在Hadoop生态体系结构中,HBase位于HDFS(Hadoop分布式文件系统)的上一层,不依赖于MapReduce,那么如果没有HBase这种Nosql数据库会 ...

  2. 从0开始学golang--2.1--如何去爬园子的数据

    20天过去了,才开始写...主要还是因为自己懒吧.之前一边上班一边也有挤时间练习golang,可是写博客却老是不能行动,跑步也没跑了.突然的就懈怠了快一个月.可能也和开始玩the elder scro ...

  3. android获取内置和外置SD卡路径 - z

    本文将介绍Android真机环境下如何获取内置和外置SD卡路径. 测试环境:三星Note3,其他手机待测试... 所需权限(AndroidManifest.xml文件里) <uses-permi ...

  4. IDEA创建Scala项目

    一.安装插件 见Scala入门篇 二.新建项目 选择new project,其中SBT相当于精简版的maven,其他的待补充.这里选择IDEA 填写信息,选择Scala SDK 在src目录下新建Sc ...

  5. Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M [ 直接修改程序机器指令,改变程序执行流程] 用命令cp pwn1 20155320备份pwn1 输入objdump -d 20155320反汇编,找到call指令 ...

  6. 使用Redis做分布式

    一 为什么使用 Redis 在项目中使用 Redis,主要考虑两个角度:性能和并发.如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis. 性能: 如 ...

  7. 6、Docker图形化管理(Portainer)

    一.Portainer简介 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控 ...

  8. 开发工具之Spark程序开发详解

    一  使用IDEA开发Spark程序 1.打开IDEA的官网地址,地址如下:http://www.jetbrains.com/idea/ 2.点击DOWNLOAD,按照自己的需求下载安装,我们用免费版 ...

  9. cocos2d-x学习之路(三)——精灵与动作

    这里我们来看看所有游戏引擎中都会出现的一个重要的概念——精灵

  10. http-cache浏览器缓存

    摘至知乎 首先得明确 http 缓存的好处 减少了冗余的数据传输,减少网费 减少服务器端的压力 Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间 加快客户端加载网页的速度 常见 ht ...