http://www.cnblogs.com/jianglangcaijin/p/3460012.html

首先将矩阵的数字排序。设置size,每次将size个数字插入。插入时,我们用h[i][j]记录该位置的数字是否已经插入;用sum[i][j]表示子矩阵(1,1)到(i,j)已经插入的数字个数总和。每次插入后,暴力扫一次询问,若查询子矩阵的数字个数大于等于K则答案就在此次插入的数字中;然后将该询问从链表中删除。

怎样知道是插入的哪个数字呢?暴力O(sqrt(n))地扫描当前这段区间,依次判断这个数插入时是否恰好达到k个。

复杂度真心不知道怎么分析了……跪了……

 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<list>
using namespace std;
struct Ask{int x1,y1,x2,y2,k,p;
Ask(const int &x){scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&k); p=x;}Ask(){}};
list<Ask>Q;
typedef list<Ask>::iterator ITER;
struct Val3{int v,x,y;}Ins[];
bool operator < (const Val3 &a,const Val3 &b){return a.v<b.v;}
int n,m,sumv[][],q,anss[];
bool vis[][];
void makeblock()
{
int sz=sqrt(q),sum=; if(!sz) sz=;
for(;sum*sz<q;++sum)
{
int l=(sum-)*sz+; int r=sum*sz;
for(int i=l;i<=r;++i) vis[Ins[i].x][Ins[i].y]=;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
sumv[i][j]=sumv[i-][j]+sumv[i][j-]-sumv[i-][j-]+vis[i][j];
ITER it=Q.begin();
while(it!=Q.end())
{
int hav=sumv[(*it).x2][(*it).y2]-sumv[(*it).x1-][(*it).y2]-
sumv[(*it).x2][(*it).y1-]+sumv[(*it).x1-][(*it).y1-];
if(hav>=(*it).k)
{
for(int i=r;i>=l;--i)
if(Ins[i].x>=(*it).x1 && Ins[i].x<=(*it).x2 &&
Ins[i].y>=(*it).y1 && Ins[i].y<=(*it).y2)
{
if(hav==(*it).k)
{
anss[(*it).p]=Ins[i].v;
break;
} --hav;
}
ITER t=it; ++it; Q.erase(t);
}
else ++it;
}
}
int l=(sum-)*sz+; int r=q;
for(int i=l;i<=r;++i) vis[Ins[i].x][Ins[i].y]=;
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
sumv[i][j]=sumv[i-][j]+sumv[i][j-]-sumv[i-][j-]+vis[i][j];
ITER it=Q.begin();
while(it!=Q.end())
{
int hav=sumv[(*it).x2][(*it).y2]-sumv[(*it).x1-][(*it).y2]-
sumv[(*it).x2][(*it).y1-]+sumv[(*it).x1-][(*it).y1-];
if(hav>=(*it).k)
{
for(int i=r;i>=l;--i)
if(Ins[i].x>=(*it).x1 && Ins[i].x<=(*it).x2 &&
Ins[i].y>=(*it).y1 && Ins[i].y<=(*it).y2)
{
if(hav==(*it).k)
{
anss[(*it).p]=Ins[i].v;
break;
} --hav;
}
ITER t=it; ++it; Q.erase(t);
}
else ++it;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
{
scanf("%d",&Ins[++q].v);
Ins[q].x=i; Ins[q].y=j;
}
sort(Ins+,Ins+q+);
for(int i=;i<=m;++i) Q.push_back(Ask(i));
makeblock();
for(int i=;i<=m;++i) printf("%d\n",anss[i]);
return ;
}

【分块】【链表】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矩阵乘法

    题意: 给你一个N*N的矩阵,没有修改,每次询问一个子矩形中的第K小数. 题目链接 思路: 当它只有一列时,其实就是区间第K大,也就是整体二分可以解决的. 现在到了二维,只需要将之前的树状数组改成二维 ...

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

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

随机推荐

  1. HDU3605:Escape(状态压缩+最大流)

    Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  2. 安卓的progress

    https://www.cnblogs.com/wolipengbo/archive/2013/10/23/3383667.html

  3. TCP ------ TCP创建服务器中出现的套接字

    在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求.这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回 ...

  4. 7月19日day11总结

    今天学习过程和小结 上午进行测试复习了 1,hdfs中namenode和datanode作用 2,hdfs副本存放机制 3,mapreduce计算处理过程 4,格式化hdfs命令 5,hdfs的核心配 ...

  5. vue2学习篇一 $mount()手动挂载

    $mount()手动挂载 //当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中: //假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载.例如: new Vue({ // ...

  6. matlab求矩阵、向量的模

    求矩阵的模: function count = juZhenDeMo(a,b) [r,c] = size(a);%求a的行列 [r1,c1] = size(b);%求b的行列 count = 0; f ...

  7. iOS 之持久化存储 plist、NSUserDefaults、NSKeyedArchiver、数据库

    1.什么是持久化? 本人找了好多文章都没有找到满意的答案,最后是从孙卫琴写的<精通Hibernate:Java对象持久化技术详解>中,看到如下的解释,感觉还是比较完整的.摘抄如下: 狭义的 ...

  8. 动态规划:LCIS

    先给出状态转移方程: 定义状态 F[i][j]表示以a串的前i个整数与b串的前j个整数且以b[j]为结尾构成的LCIS的长度 状态转移方程: ①F[i][j] = F[i-][j] (a[i] != ...

  9. Idea工具点滴积累

    方法参数提示: keymap里面搜索 quick document,默认是F2

  10. React事件处理程序

    function ActionLink() { function handleClick(e) { e.preventDefault(); console.log('The link was clic ...