题意:

给你一个N*N的矩阵,没有修改,每次询问一个子矩形中的第K小数。

题目链接

思路:

当它只有一列时,其实就是区间第K大,也就是整体二分可以解决的。

现在到了二维,只需要将之前的树状数组改成二维的就可以了。

注意事项:

二维的容斥稍显繁杂,注意一下

二维树状数组不要打错

code:

#include<bits/stdc++.h>
using namespace std;
const int N=505;
const int Q=60005;
struct node{int pt1_x,pt1_y,pt2_x,pt2_y,k,id,tp;}a[N*N+Q],a1[N*N+Q],a2[N*N+Q];
int n,q,cnt,ans[Q];
inline int read()
{
int s=0,w=1; char ch=getchar();
for(;'0'>ch||ch>'9';ch=getchar())if(ch=='-')w=-1;
for(;'0'<=ch&&ch<='9';ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
return s*w;
}
struct tree{
int c[N][N];
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int y,int v)
{
int yy=y;
for(;x<=n;x+=lowbit(x))
for(y=yy;y<=n;y+=lowbit(y))
c[x][y]+=v;
}
inline int query(int x,int y)
{
int yy=y,anss=0;
for(;x;x-=lowbit(x))
for(y=yy;y;y-=lowbit(y))
anss+=c[x][y];
return anss;
}
}T;
void solve(int L,int R,int l,int r)
{
if(l>r) return;
if(L==R)
{
for(int i=l;i<=r;++i)
if(a[i].tp) ans[a[i].id]=L;
return;
}
int mid=L+R>>1,cnt1=0,cnt2=0;
for(int i=l;i<=r;++i)
{
if(!a[i].tp)
{
if(a[i].k<=mid) T.add(a[i].pt1_x,a[i].pt1_y,1),a1[++cnt1]=a[i];
else a2[++cnt2]=a[i];
}
else
{
int num=T.query(a[i].pt2_x,a[i].pt2_y)-T.query(a[i].pt2_x,a[i].pt1_y-1)-T.query(a[i].pt1_x-1,a[i].pt2_y)+T.query(a[i].pt1_x-1,a[i].pt1_y-1);
if(a[i].k<=num) a1[++cnt1]=a[i];
else a2[++cnt2]=a[i],a2[cnt2].k-=num;
}
}
for(int i=l;i<=r;++i)
if(!a[i].tp&&a[i].k<=mid) T.add(a[i].pt1_x,a[i].pt1_y,-1);
for(int i=l;i<=l+cnt1-1;++i)a[i]=a1[i-l+1];
for(int i=l+cnt1;i<=r;++i)a[i]=a2[i-l-cnt1+1];
solve(L,mid,l,l+cnt1-1);
solve(mid+1,R,l+cnt1,r);
}
int main()
{
n=read(),q=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
a[++cnt]=node{i,j,0,0,read(),0,0};
for(int i=1;i<=q;++i)
{
int _x1=read(),_y1=read(),_x2=read(),_y2=read(),_k=read();
a[++cnt]=node{_x1,_y1,_x2,_y2,_k,i,1};
}
solve(0,1e9,1,cnt);
for(int i=1;i<=q;++i)
printf("%d\n",ans[i]);
return 0;
}

bzoj2738矩阵乘法的更多相关文章

  1. [bzoj2738]矩阵乘法_整体二分_树状数组

    矩阵乘法 bzoj-2738 题目大意:给定一个$n*n$的矩阵.每次给定一个矩阵求矩阵$k$小值. 注释:$1\le n\le 500$,$1\le q\le 6\cdot 10^4$. 想法: 新 ...

  2. BZOJ2738: 矩阵乘法

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

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

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

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

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

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

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

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

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

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

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

  8. 【分块】【链表】bzoj2738 矩阵乘法

    http://www.cnblogs.com/jianglangcaijin/p/3460012.html 首先将矩阵的数字排序.设置size,每次将size个数字插入.插入时,我们用h[i][j]记 ...

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

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

随机推荐

  1. 『Python基础』第8节:格式化输出

    现在有一个需求, 询问用户的姓名, 年龄, 工作, 爱好, 然后打印成以下格式 ************ info of Conan ************ name: Conan age: 23 ...

  2. Map、FlatMap 和 Reduce

    Map 作用是生成一个新数组,遍历原数组,将每个元素拿出来做一些变换然后 append 到新的数组中. [1, 2, 3].map((v) => v + 1) // -> [2, 3, 4 ...

  3. js数组转对象

    var obj = {}; var arr = [1,2,3,4,5]; for (var x in arr){ obj[x] = x; } 2.ES6的Object.assign: Object.a ...

  4. springboot 常见的启动器

    <!--pringBoot提供了一个名为spring-boot-starter-parent的工程, 里面已经对各种常用依赖(并非全部)的版本进行了管理 我们的项目需要以这个项目为父工程,这样我 ...

  5. Java 之 InputStreamReader 类

    InputStream 类 1.概述 转换流 java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁.  该类读取字节,并使用指定的字符集将其解码为字符. ...

  6. sysfs和kobject

    sysfs文件系统: sysfs是2.6内核的一个特性,它允许内核代码经由一个in-memory的文件系统把信息出报(export)到用户进程中. 在设备模型中,sysfs文件系统用来表示设备的结构. ...

  7. Hbase Region in transition问题解决

    1  hbase hbck -repair 强制修复 如果ok就可以 2 不ok,找到hdfs上对应的该表位置,删除,之后在使用hbase hbck -repair 解决过程: 第一次,使用了方法二, ...

  8. Django drf: 跨域机制

    一.同源策略 二.CORS(跨域资源共享)简介 三.CORS基本流程 四.CORS两种请求流程 五.Django项目中支持CORS 一.同源策略 同源策略是一种约定,它是浏览器最核心的最基本的安全功能 ...

  9. nginx的应用【虚拟主机】

    Nginx主要应用: 静态web服务器 负载均衡 静态代理虚拟主机 虚拟主机 :虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配 ...

  10. RTC — 软件协作开发管理平台

    IBM Rational Team Concert (简称RTC )是构建在IBM Rational面向软件交付技术的下一代协作平台Jazz平台上的一个商用产品.一个协作式的软件开发环境,它包含了集成 ...