BZOJ_2738_矩阵乘法_整体二分

Description

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

  矩阵中数字是109以内的非负整数;
  20%的数据:N<=100,Q<=1000;
  40%的数据:N<=300,Q<=10000;
  60%的数据:N<=400,Q<=30000;
  100%的数据:N<=500,Q<=60000。


可以离线,把权值排序。

solve(b,e,l,r)表示b到e的询问的答案在l到r范围的权值内。

答案mid,就插入前mid个数,然后查询区间有多少个数,可以用二维树状数组维护。

答案在左边就往左走,在右边就减去左边的贡献往右走。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 60050
int n,c[550][550],L[N],R[N],mid[N],ans[N];
struct A {
int v,x,y;
}a[550*550];
struct Q {
int d,f,g,h,k,id;
}q[N],t[N];
bool cmp(const A &a,const A &b) {
return a.v<b.v;
}
void fix(int x,int y,int v) {
int i,j;
for(i=x;i<=n;i+=i&(-i)) {
for(j=y;j<=n;j+=j&(-j)) {
c[i][j]+=v;
}
}
}
int inq(int x,int y) {
int i,j,re=0;
for(i=x;i;i-=i&(-i)) {
for(j=y;j;j-=j&(-j)) {
re+=c[i][j];
}
}
return re;
}
int query(int x,int y,int x2,int y2) {
x--; y--;
return inq(x2,y2)-inq(x,y2)-inq(x2,y)+inq(x,y);
}
void solve(int b,int e,int l,int r) {
int i;
if(b>e) return ;
if(l==r) {
for(i=b;i<=e;i++) {
ans[q[i].id]=a[l].v;
}
return ;
}
int mid=(l+r)>>1,lpos=b,rpos=e;
for(i=l;i<=mid;i++) {
fix(a[i].x,a[i].y,1);
}
for(i=b;i<=e;i++) {
int sizls=query(q[i].d,q[i].f,q[i].g,q[i].h);
if(sizls>=q[i].k) t[lpos++]=q[i];
else q[i].k-=sizls,t[rpos--]=q[i];
}
for(i=b;i<=e;i++) q[i]=t[i];
for(i=l;i<=mid;i++) {
fix(a[i].x,a[i].y,-1);
}
solve(b,lpos-1,l,mid);
solve(rpos+1,e,mid+1,r);
}
int main() {
int m;
scanf("%d%d",&n,&m);
int i,tot=0,j;
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
scanf("%d",&a[++tot].v);
a[tot].x=i; a[tot].y=j;
}
}
sort(a+1,a+n*n+1,cmp);
for(i=1;i<=m;i++) {
scanf("%d%d%d%d%d",&q[i].d,&q[i].f,&q[i].g,&q[i].h,&q[i].k);
q[i].id=i;
}
solve(1,m,1,n*n);
for(i=1;i<=m;i++) printf("%d\n",ans[i]);
}

BZOJ_2738_矩阵乘法_整体二分的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. bzoj 2738: 矩阵乘法【整体二分+树状数组】

    脑子一抽开始写主席树,敲了一会发现不对-- 整体二分,用二维树状数组维护值为当前区间的格子个数,然后根据k的大小和当前询问的子矩阵里的值和k的大小关系来决定这个询问放在哪一部分向下递归 #includ ...

  7. P1527 [国家集训队]矩阵乘法(整体二分)

    Link 整体二分的经典例题. 对于整体二分,我个人的理解是二分答案套分治. 具体来说就是对答案进行二分,然后对于询问进行类似于权值线段树求区间第 \(k\) 大的分治做法. 首先,我们暴力做法就是对 ...

  8. Tsinsen A1333: 矩阵乘法(整体二分)

    http://www.tsinsen.com/A1333 题意:-- 思路:和之前的第k小几乎一样,只不过把一维BIT换成二维BIT而已.注意二维BIT写法QAQ #include <cstdi ...

  9. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

随机推荐

  1. wamp 服务监控和启动

    近日我的 wamp 莫名其妙的崩溃重启,apache 能自动起来, mysql 却悲剧了. 于是有了下面的wamp服务监控和启动的批处理文件 @echo off rem define loop tim ...

  2. 伸展树--java

    文字转载自:http://www.cnblogs.com/vamei 代码转载自:http://www.blogjava.net/javacap/archive/2007/12/19/168627.h ...

  3. 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)

    计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...

  4. jjava Date格式是 May 07 17:44:06 CST 2018,怎么插入数据库中的timestamp格式中

    首先 我来记录下错误 死在时间格式转换错误手里了 大致就是时间格式转化失败 java代码中的May 07 17:44:06 CST 2018  是这个格式转换为 数据库的 yyyy-MM-dd HH: ...

  5. Swift内部类调用外部类方法、属性的变通

    Swift的内部类比较鸡肋,在内部类里面不能调用外部类的属性或方法,那么如何解决这个问题,把内部类里面调用外部类的那部分代码方法移动到外部类里面,成为外部类的方法,是一种变通解决方式.

  6. SDCC2013大会笔记整理

    2013-8-30 大会首日 百度移动云三大框架:Clouda.SiteApp.Appbuilder MBaaS解决高性能Server很难构建的问题. 百度开放云的区域运营服务于创业者 ------- ...

  7. Ubuntu硬盘空间清理

    1.删除多余的安装下载文件: sudo aptitude autoclean sudo aptitude clean 2.删除多余的内核版本: sudo apt-get autoremove 4.去/ ...

  8. 人脸姿态校正算法 附完整C++示例代码

    在一些特殊情况下,经常需要依据图像中的人脸,对图片进行倾斜矫正. 例如拍照角度幅度过大之类的情况,而进行人工矫正确实很叫人头大. 那是不是可以有一种算法,可以根据人脸的信息对图片进行角度的修复呢? 答 ...

  9. meta 刷新

    <meta http-equiv="refresh" content="5;url=地址" /> 5秒后刷新至URL地址

  10. 如何避免 await/async 地狱

    原文地址:How to escape async/await hell 译文出自:夜色镇歌的个人博客 async/await 把我们从回调地狱中解救了出来,但是如果滥用就会掉进 async/await ...