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. C#语法糖大汇总【转发】

    首先需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕不已,呵呵. 1.  ...

  2. UVA10480:Sabotage(最小割+输出)

    Sabotage 题目链接:https://vjudge.net/problem/UVA-10480 Description: The regime of a small but wealthy di ...

  3. Educational Codeforces Round 55 (Rated for Div. 2):E. Increasing Frequency

    E. Increasing Frequency 题目链接:https://codeforces.com/contest/1082/problem/E 题意: 给出n个数以及一个c,现在可以对一个区间上 ...

  4. HDU1859 最小长方形 (水

    最小长方形 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  5. hadoop删除节点和添加节点

    从hadoop移除机器把需要移除的机器增加到exclueds文件中,强制刷新datanode列表,等待decommission 状态正常后,即可停机下架,如有必要在namenode执行balancer ...

  6. php-instanceof运算符

    1.关于 instanceof 的一些基本概念 1).instanceof 用于确定一个PHP变量是否属于某一类class的实例: <?php class MyClass { } class N ...

  7. JavaScript创建对象时常用的设计模式

    转自:http://www.cnblogs.com/shouce/p/5488101.html 一.工厂模式 function person (name,age) { var p=new Object ...

  8. Exceptioninthread"main"java.lang.ClassNotFoundsException的问题

    报错如下: Exceptioninthread"main"java.lang.ClassNotFoundsException 大致可以判断出是无法定位到main方法,应该是用mav ...

  9. [BZOJ3238][Ahoi2013]差异解题报告|后缀数组

    Description 先分析一下题目,我们显然可以直接算出sigma(len[Ti]+len[Tj])的值=(n-1)*n*(n+1)/2 接着就要去算这个字符串中所有后缀的两两最长公共前缀总和 首 ...

  10. 【洛谷 P1070】道路游戏 (DP)

    题目链接 这题还是很好想的,看到\(90%\)的数据点时,我就知道要用\(n^3\)的算法(最后10分就算了吧) 然后,数据水,直接暴力\(n^3\)卡过了. 显然是道DP. 设\(f[i]\)表示第 ...