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. HLPP

    LOJ 最大流加强版 #include <bits/stdc++.h> const int inf=0x7fffffff; const int maxn=1210; const int m ...

  2. ios webapp调试神器MIHTool

    android平台有直接用chrome beta就可以调试,具体操作办法可以查看这篇教程<Android 设备 Chrome 远程调试>Mac的高富帅直接可以用safari提供“web检查 ...

  3. domReady的兼容性实现方法

    一.为何要实现domReay方法? 举例: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  4. iOS 单元测试(Unit Test 和 UI Test)

    之前一直搞过~~最近试了一下下,完美~~ 附上一篇文章,不同的伙伴可以看看: http://www.jianshu.com/p/009844a0b9edUnitTest(简单的单元测试使用) http ...

  5. bzoj3223 文艺平衡树 codevs3303 翻转区间

    splay模版题吧 只有区间翻转 至于为什么要把须翻转区间旋到根 因为查找一个区间可以先找出他左端点左边第一个点和右端点x右边第一个点y 然后将x旋到根节点 y旋到x的右儿子 这样x的右边的点就是所有 ...

  6. [ CodeVS冲杯之路 ] P2952

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/2952/ 题目讲一个细胞可分裂成 2 个,那么当前数目就是2a,a 为时间 然后 q 个细胞一起会死亡,也就是对 q 取 ...

  7. Linux搭建JavaEE开发环境与Tomcat——(十)

    服务器通过ip地址访问是不需要备案的,如果通过域名访问的话才需要备案. 1.安装Mysql 在CentOS7上安装MySQL时,出现了以下的提示: 原因是: CentOS7带有MariaDB而不是my ...

  8. iOS 中捕获程序崩溃日志 (2014-04-22 17:35:59)

    http://blog.sina.com.cn/s/blog_b71d24920101ky2d.html iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软 ...

  9. (接口自动化)Python3操作MySQL数据库

    基础语法: import pymysql #导入模块 conn = pymysql.connect(host='localhost',user='root', passwd='123456', db= ...

  10. jquery发送json请求,给springmvc接收

    js var obj = { 'name':name, 'desc':desc, 'scheduleStartTime':scheduleStartTime, 'scheduleEndTime':sc ...