传送门

Description

给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数。

Solution

整体二分

练习一波。。。

就是一堆询问放在一起二分

另外的,第一次发现原来矩形求和是可以用二维树状数组来维护的

果然是pac太菜了

class BIT
{
#define NM 505
#define lb(x) (x&(-x))
private:
int t[NM][NM],N,M;
BIT() {}
public:
BIT(int _N=0,int _M=0):N(_N),M(_M){memset(t,0,sizeof t);}
inline void C(int x,int y,int v)
{
register int i,j;
for(i=x;i<=N;i+=lb(i))for(j=y;j<=M;j+=lb(j)) t[i][j]+=v;
}
inline int G(int x,int y)
{
register int i,j,ret=0;
for(i=x;i;i-=lb(i))for(j=y;j;j-=lb(j)) ret+=t[i][j];
return ret;
}
inline int GM(int x,int y,int a,int b){return G(a,b)-G(x-1,b)-G(a,y-1)+G(x-1,y-1);}
};

Code 

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define MN 60002
#define MS 250005
int N,Q,Ans[MN];
struct ques{int x1,y1,x2,y2,k,id;}q[MN],b[MN];
struct nums{
int x,y,val;
bool operator <(const nums &o) const{return val<o.val;}
}s[MS];
class BIT
{
#define NM 505
#define lb(x) (x&(-x))
private:
int t[NM][NM],N,M;
BIT() {}
public:
BIT(int _N=0,int _M=0):N(_N),M(_M){memset(t,0,sizeof t);}
inline void C(int x,int y,int v)
{
register int i,j;
for(i=x;i<=N;i+=lb(i))for(j=y;j<=M;j+=lb(j)) t[i][j]+=v;
}
inline int G(int x,int y)
{
register int i,j,ret=0;
for(i=x;i;i-=lb(i))for(j=y;j;j-=lb(j)) ret+=t[i][j];
return ret;
}
inline int GM(int x,int y,int a,int b){return G(a,b)-G(x-1,b)-G(a,y-1)+G(x-1,y-1);}
};
void solve(int l=1,int r=N*N,int ql=1,int qr=Q)
{
static BIT T(N,N);
register int i;
if(ql>qr) return;
if(l==r)
{
for(i=ql;i<=qr;++i) Ans[q[i].id]=l;
return;
}
register int mid=(l+r)>>1,tmpl=ql,tmpr=qr,gm;
for(i=l;i<=mid;++i) T.C(s[i].x,s[i].y,1);
for(i=ql;i<=qr;++i) (gm=T.GM(q[i].x1,q[i].y1,q[i].x2,q[i].y2))>=q[i].k?b[tmpl++]=q[i]:(q[i].k-=gm,b[tmpr--]=q[i]);
for(i=ql;i<=qr;++i) q[i]=b[i];
for(i=l;i<=mid;++i) T.C(s[i].x,s[i].y,-1);
solve(l,mid,ql,tmpl-1);solve(mid+1,r,tmpr+1,qr);
}
int main()
{
N=read();Q=read();
register int i,j;
for(i=1;i<=N;++i)for(j=1;j<=N;++j) s[(i-1)*N+j]=(nums){i,j,read()};
for(i=1;i<=Q;++i) q[i].x1=read(),q[i].y1=read(),q[i].x2=read(),q[i].y2=read(),q[i].k=read(),q[i].id=i;
std::sort(s+1,s+N*N+1);
solve();
for(i=1;i<=Q;++i) printf("%d\n",s[Ans[i]].val);
return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

[luogu P1527]矩阵乘法(矩形k小)的更多相关文章

  1. LeetCode 378. 有序矩阵中第K小的元素(Kth Smallest Element in a Sorted Matrix) 13

    378. 有序矩阵中第K小的元素 378. Kth Smallest Element in a Sorted Matrix 题目描述 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩 ...

  2. [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  3. [Swift]LeetCode378. 有序矩阵中第K小的元素 | Kth Smallest Element in a Sorted Matrix

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  4. Leetcode 378.有序矩阵中第k小的元素

    有序矩阵中第k小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, ...

  5. 378 Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素.示例:matrix = [   [ 1,  5,  9],   [ ...

  6. [LeetCode] 378. Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  7. leetcode.矩阵.378有序矩阵中第K小的元素-Java

    1. 具体题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1,  5, ...

  8. 【Leetcode 堆、快速选择、Top-K问题 BFPRT】有序矩阵中第K小的元素(378)

    题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, 5, 9], [ ...

  9. Java实现 LeetCode 378 有序矩阵中第K小的元素

    378. 有序矩阵中第K小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ ...

随机推荐

  1. Linux mount/unmount 挂载和卸载指令

    对于Linux用户来讲,不论有几个分区,分别分给哪一个目录使用,它总归就是一个根目录.一个独立且唯一的文件结构 Linux中每个分区都是用来组成整个文件系统的一部分,她在用一种叫做“挂载”的处理方法, ...

  2. springboot下@webfilter的使用

    启动类加了@ServletComponentScan,无论过滤器类加不加@Componment urlPatterns = {"/test/*"}都可以生效 单使用@Compone ...

  3. JavaScript作用域、作用域链 学习随笔

    (本文是这些知识点的自我理解.写之余从头回顾,加深理解.取得更多收获之用.) 作用域(scope) 程序设计概念,通常来说,一段程序代码中所用到的名字(JS叫标识符(如变量名.函数名.属性名.参数.. ...

  4. OpenStack kilo版(6) 启动第一台虚拟机

    创建网络 提供者为external,类型为flat,网络名称为public,: root@controller:~# neutron net-create --shared --provider:ph ...

  5. mysql主从部署

    一.安装环境 1.系统环境 系统 IP 主机名 说明 server_id centos6.7 192.168.0.173 master 数据库:主 173  centos6.7 192.168.0.1 ...

  6. 14 Windows编程——SetWindowLong

    使用默认窗口处理函数,源码 #include<Windows.h> #include<Windowsx.h> LRESULT CALLBACK WindProc(HWND hw ...

  7. Python Django开发遇到的坑(版本不匹配)

    这个问题 进入django 后台, 添加,修改都不可以,只有删除可以,那么百分之百是这个问题 对照一下,是你的django 版本低了还是 python版本高了,对照的话就没问题了 这个坑,弄了两天啊! ...

  8. 3D Experience — 产品协同研发平台

    随着产品复杂程度的提升,市场竞争愈加激烈,基于模型的正向研发已经作为有效的应对手段被广泛接受.但研发流程中仍然存在复杂功能架构定义困难.多方案难以权衡.多系统难以联合仿真,仿真效率低,验证不充分等问题 ...

  9. Pytohn笔记(31)----第三方包

    摘自: https://www.jianshu.com/p/bbc8672a2d09 一. from __future__ import **** [版本更新之后想在原来的版本使用新版本的一些功能] ...

  10. 读入 并查集 gcd/exgcd 高精度 快速幂

    ios_base::sync_with_stdio(); cin.tie(); ], nxt[MAXM << ], Head[MAXN], ed = ; inline void added ...