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

愚蠢的名字......
整体二分,影响因子就是矩阵里的数
把$\le mid$的矩阵元素加到二维树状数组里然后询问分成两组就行了
可以把矩阵元素权值排序后直接二分矩阵元素而不是值
复杂度$O(nlog^3n)$
用排序代替一维树状数组理论上更快,但需要把矩阵里的元素和查询放到一个数组里再排序貌似常数太大
然后发现黄学长的做法是错误的复杂度不对....但竟然比我快....
 
二维树状数组一定不要写错!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=,M=6e4+,INF=1e9;
typedef long long ll;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,Q;
struct Factor{
int x,y,v;
Factor(){}
Factor(int a,int b,int c):x(a),y(b),v(c){}
bool operator <(const Factor &r)const{return v<r.v;}
}a[N*N];
int m,now=; struct Query{
int x1,y1,x2,y2,k;
}q[M];
int id[M],t1[M],t2[M],cur[M]; int c[N][N];
inline int lowbit(int x){return x&-x;}
inline void add(int x,int y,int v){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j)) c[i][j]+=v;
}
inline int sum(int x,int y){
int re=;
for(int i=x;i;i-=lowbit(i))
for(int j=y;j;j-=lowbit(j)) re+=c[i][j];
return re;
}
inline int que(int i){
int x1=q[i].x1-,y1=q[i].y1-,x2=q[i].x2,y2=q[i].y2;
return sum(x2,y2)-sum(x1,y2)-sum(x2,y1)+sum(x1,y1);
}
int ans[M];
void Sol(int l,int r,int ql,int qr){
if(ql>qr) return;
if(l==r){
for(int i=ql;i<=qr;i++) ans[id[i]]=a[l].v;
return;
}
int mid=(l+r)>>;
for(int i=l;i<=mid;i++) add(a[i].x,a[i].y,);
int p1=,p2=;
for(int i=ql;i<=qr;i++){
int u=id[i],s=cur[u]+que(u);
if(s>=q[u].k) t1[++p1]=u;
else t2[++p2]=u,cur[u]=s;
}
for(int i=l;i<=mid;i++) add(a[i].x,a[i].y,-);
for(int i=;i<=p1;i++) id[ql+i-]=t1[i];
for(int i=;i<=p2;i++) id[ql+p1+i-]=t2[i];
Sol(l,mid,ql,ql+p1-);
Sol(mid+,r,ql+p1,qr);
}
int main(){
freopen("in","r",stdin);
n=read();Q=read();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) a[++m]=Factor(i,j,read());
for(int i=;i<=Q;i++)
q[i].x1=read(),q[i].y1=read(),q[i].x2=read(),q[i].y2=read(),q[i].k=read();
sort(a+,a++m);
for(int i=;i<=Q;i++) id[i]=i;
Sol(,m,,Q);
for(int i=;i<=Q;i++) printf("%d\n",ans[i]);
}

BZOJ 2738: 矩阵乘法 [整体二分]的更多相关文章

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

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

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

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

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

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

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

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

  5. bzoj 2738 矩阵乘法

    其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...

  6. [BZOJ 2738] 矩阵乘法 【分块】

    题目链接:BZOJ - 2738 题目分析 题目名称 “矩阵乘法” 与题目内容没有任何关系..就像VFK的 A+B Problem 一样.. 题目大意是给定一个矩阵,有许多询问,每次询问一个子矩阵中的 ...

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

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

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

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

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

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

随机推荐

  1. 判断标签是否包含class的方法

    if ($(this).find('i').hasClass('l-icon-wuxing')) { //取消收藏 $(this).find('i').removeClass('l-icon-wuxi ...

  2. Winform & Devexpress Chart使用入门

    一.Chart(Winform) 使用图表控件(chart)首先要理解图表区域(ChartArea).XY轴(AxisX.AxisY).数据点(Series).标题(Title).图例(Legend) ...

  3. 二维数组模拟实现酒店管理系统-java

    业务分析 1.需要一个房间类,包含房间的属性,比如房间编号.房间类型.是否占用. 2.需要一个旅馆类,旅馆有房间,提供的方法需要有 预订房间.打印房间信息.初始化房间.退房. 3.测试类,测试预订房间 ...

  4. JavaScrip 排序算法

    转自: http://blog.givebest.cn/javascript/2017/08/02/javascript-sorting-algorithms.html 基础构造函数 以下几种排序算法 ...

  5. java 数据类型间的转换

    byte a = (byte)129; 129已经超过了byte数据类型的存储上限,所以需要在值的前面加括号需要转换的数据类型名. 但是从高往低转的时候数值精度会有丢失; 所以最后结果为 a = -1 ...

  6. 安装Wamp后 Apache无法启动的解决方法

    安装Wamp后 Apache无法启动的解决方法,网上的解决方案可以说是五花八门,有些说了一大推,一点作用都起不到. 其实解决方法只需两步: 1.安装路径不能包含有中文,这个我不知道为什么,总之如果安装 ...

  7. PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址

    转载:http://www.5idev.com/p-php_server_http_referer.shtml 使用 $_SERVER['HTTP_REFERER'] 将很容易得到链接到当前页面的前一 ...

  8. DOS基本命令(基本部分)

    一.cls(clear screen的简写) 命令作用:清屏屏幕 详细介绍:屏幕显示的所有字符信息都是存放在一个屏幕缓冲区中,cls命令的作用是清除屏幕上的文字,并将该缓冲区清空. 二.dir(dir ...

  9. 【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作

    1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...

  10. Django之modelform组件

    一.简介与基本使用 简介:django中的modelform组件同时具有model和form作用,但是耦合度比较高,当项目需要拆分时候就比较困难了,所以在使用modelform时候需要先考虑项目的扩展 ...