矩阵乘法 bzoj-2738

题目大意:给定一个$n*n$的矩阵。每次给定一个矩阵求矩阵$k$小值。

注释:$1\le n\le 500$,$1\le q\le 6\cdot 10^4$。


想法

新操作整体二分。

整体二分是一个必须离线的算法而且所求的答案必须满足单调性。

所谓单调性就是比如这个题:k越大那么对应的答案越大。

进而我们将所有操作在权值上整体二分。

每次假设当前权值区间为$[l,r]$。

先用二维树状数组求出每个矩形[l,mid]中的点个数然后暴力转移即可。

暴力转移就是看一下$k_i$和个数哪个比较大,考虑把当前操作扔进左区间还是右区间。

Code:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define N 510
  6. #define M 60010
  7. using namespace std;
  8. int tree[N<<1][N<<1],ans[M],n,m;
  9. struct pnt {int x,y,val;}a[N*N]; inline bool cmp(const pnt &a,const pnt &b) {return a.val<b.val;}
  10. struct Node {int x1,x2,y1,y2,k,id;}q[M],t[M];
  11. inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
  12. int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
  13. inline int lowbit(int x) {return x&(-x);}
  14. void update(int x,int y,int val)
  15. {
  16. for(int i=x;i<=n+1;i+=lowbit(i)) for(int j=y;j<=n+1;j+=lowbit(j)) tree[i][j]+=val;
  17. }
  18. int query(int x,int y)
  19. {
  20. int ans=0; for(int i=x;i>=1;i-=lowbit(i)) for(int j=y;j>=1;j-=lowbit(j)) ans+=tree[i][j];
  21. return ans;
  22. }
  23. void solve(int x,int y,int l,int r)
  24. {
  25. int tl=x,tr=y;
  26. if(x>y) return;
  27. if(l==r)
  28. {
  29. for(int i=x;i<=y;i++) ans[q[i].id]=a[l].val;
  30. return;
  31. }
  32. int mid=(l+r)>>1;
  33. for(int i=l;i<=mid;i++) update(a[i].x,a[i].y,1);
  34. for(int i=x;i<=y;i++)
  35. {
  36. int dlt=query(q[i].x1-1,q[i].y1-1)+query(q[i].x2,q[i].y2)-query(q[i].x1-1,q[i].y2)-query(q[i].x2,q[i].y1-1);
  37. if(q[i].k<=dlt) t[tl++]=q[i];
  38. else q[i].k-=dlt,t[tr--]=q[i];
  39. }
  40. for(int i=x;i<=y;i++) q[i]=t[i];
  41. for(int i=l;i<=mid;i++) update(a[i].x,a[i].y,-1);
  42. solve(x,tr,l,mid); solve(tl,y,mid+1,r);
  43. }
  44. int main()
  45. {
  46. n=rd(),m=rd(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
  47. {
  48. int id=(i-1)*n+j;
  49. a[id].val=rd(); a[id].x=i,a[id].y=j;
  50. }
  51. sort(a+1,a+n*n+1,cmp);
  52. for(int i=1;i<=m;i++) q[i].x1=rd(),q[i].y1=rd(),q[i].x2=rd(),q[i].y2=rd(),q[i].k=rd(),q[i].id=i;
  53. solve(1,m,1,n*n);
  54. for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
  55. return 0;
  56. }

小结:整体二分好好玩~

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

  1. 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组

    [BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...

  2. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

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

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

  4. bzoj4009 [HNOI2015]接水果 整体二分+扫描线+树状数组+dfs序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4009 题解 考虑怎样的情况就会有一个链覆盖另一个链. 设被覆盖的链为 \(a - b\),覆盖 ...

  5. Luogu3527 POI2011 Meteors 整体二分、树状数组、差分

    传送门 比较板子的整体二分题目,时限有点紧注意常数 整体二分的过程中将时间在\([l,mid]\)之间的流星使用树状数组+差分进行维护,然后对所有国家查看一遍并分好类,递归下去,记得消除答案在\([m ...

  6. BZOJ2738 矩阵乘法(整体二分+树状数组)

    单个询问二分答案即可,多组询问直接整体二分再二维BIT.注意保证复杂度. #include<iostream> #include<cstdio> #include<cma ...

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

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

  8. [luogu4479][BJWC2018]第k大斜率【二维偏序+二分+离散化+树状数组】

    传送门 https://www.luogu.org/problemnew/show/P4479 题目描述 在平面直角坐标系上,有 n 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直 ...

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

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

随机推荐

  1. 如何通过SecureCRT作为客户端连接Linux服务器

    主机cmd ping虚拟机失败 打开计算机-管理-服务,找到所有以VMare开头的服务,右键点击启动即可,此时主机即可ping通虚拟机 可ping通之后,在主机cmd窗口输入 ssh root@192 ...

  2. AJPFX关于数组获取最值的思路和方法

    思路分析:1.定义一个变量(max,初始值一般为数组中的第一个元素值),用来记录最大值.2.遍历数组,获取数组中的每一个元素,然后依次和max进行比较.如果当前遍历到的元素比max大,就把当前元素值给 ...

  3. jq星星评分

    html代码 <div class="make_mark"> <h5>请为这次服务打分</h5> <div class="mar ...

  4. robotframework + python2.7.9 + selenium 2.44.0 + selenium2library1.7 测试环境搭建成功!

    真心不容易呀!开源软件搭建挺麻烦的,各种组件未必要使用最新的版本:有些最新版本反而不兼容.需要仔细看官方说明书来进行搭建(官方网站都是英文),所以闹得重新安装了几次. 先上测试用例通过的图:

  5. linux下svn安装(ALI ECS)

    yum安装svn 搭建和使用SVN 可参考阿里云文档:https://help.aliyun.com/document_detail/52864.html?spm=5176.8208715.110.1 ...

  6. SCHTASKS /CREATE

    SCHTASKS   "/" 这个符号前要加个空格才能运行成功  ,搞半天!

  7. 迅为4418开发板Qt移植移动4G模块第二部分

    第一部分: http://www.cnblogs.com/topeet/p/6509248.html 第二部分: 5.ping不通域名一般是DNS没有设置对造成的.在etc下有一个文件resolv.c ...

  8. CAD设置背景图片(com接口)

    把图片作为背景图片可见但是不能编辑操作. 主要用到函数说明: _DMxDrawX::DrawImageToBackground 绘光栅图到背景.详细说明如下: 参数 说明 BSTR sFileName ...

  9. Beam Search

    Q: 什么是Beam Search? 它在NLP中的什么场景里会⽤到? 传统的广度优先策略能够找到最优的路径,但是在搜索空间非常大的情况下,内存占用是指数级增长,很容易造成内存溢出,因此提出了beam ...

  10. 微信小程序(template的使用)

    小程序的template是一个模版功能,在创建一个template后,其他的页面可以引用,相比component较简单.方便! template只需要两个文件,一个wxss文件和wxml文件,也只有这 ...