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. POJ2236:Wireless Network(并查集)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 39772   Accepted: 164 ...

  2. codeforces 1077F1

    题目:https://codeforces.com/contest/1077/problem/F1 题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x 表示你要从中选出刚好x幅画,并且 ...

  3. 使用babel把es6代码转成es5代码

    第一步:创建一个web项目 使用命令:npm init 这个命令的目的是生成package.json. 执行第二步中的命令后生成的package.json的文件的内容是: { "name&q ...

  4. Centos系统修改hostname

    1.用命令临时修改 hostname oier 这样,服务器的hostname就变成oier了,但是重启之后会变回去 2.编辑配置文件永久修改 vi /etc/sysconfig/network HO ...

  5. GTK+与MFC不完全对比

    转载自:http://tech.ddvip.com/2007-11/119640973738229.html 1. 两者都是基于面向对象设计的.尽管MFC是用C++写的,而GTK+是用C写的,但思想都 ...

  6. DOM操作的一个小坑

    最近在苦读<JavaScript高级程序教程>,真不愧是前端圣经,学到了很多东西. nodeList.NameNodeMap.HTMLCollection这三个集合是动态的!每当文档发生变 ...

  7. Java中中英文对齐输出问题,以及Java中的格式化输出

    一 中英文对齐输出问题 问题,要求控制台输出如下: abcefg  def 森林 阿狗 其实就是要求对齐输出,各种查找java的格式化输出,然后发现只要一个简单的“\t”就可以实现. 代码如下: Sy ...

  8. .NET之特性和属性(转)

    1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定 ...

  9. bzoj2453/2120 数颜色

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2120 http://www.lydsy.com/JudgeOnline/problem.ph ...

  10. bzoj3127/3697 [Usaco2013 Open]Yin and Yang

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3127 http://www.lydsy.com/JudgeOnline/problem.ph ...