矩阵乘法

【问题描述】

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

【输入格式】

第一行两个数N,Q,表示矩阵大小和询问组数;
接下来N行N列一共N*N个数,表示这个矩阵;
再接下来Q行每行5个数描述一个询问:x1,y1,x2,y2,k表示找到以(x1,y1)为左上角、以(x2,y2)为右下角的子矩形中的第K小数。

【输出格式】

对于每组询问输出第K小的数。

【样例输入】

2 2
2 1
3 4
1 2 1 2 1
1 1 2 2 3
【样例输出】

1
3

【样例说明】

矩阵中数字是109以内的非负整数;
20%的数据:N<=100,Q<=1000;
40%的数据:N<=300,Q<=10000;
60%的数据:N<=400,Q<=30000;
100%的数据:N<=500,Q<=60000。


题解:

将每个点储存下来,排序一下,和询问进行二分

我们将小于等于当前枚举的答案(即为mid)的点加入树状数组

对于区间内的询问,查询子矩阵内的小于等于mid的个数,如果大于等于这个询问要求的k,将其放置在左区间,表示第k小在l到mid之间

否则放置在右区间,表示第k小在mid+1到r之间

 #include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline void Scan(int &x)
{
char c;
while((c = getchar()) < '' || c > '');
x = c - '';
while((c = getchar()) >= '' && c <= '')
x = x * + c - '';
}
const int maxn = ;
const int maxq = ;
struct dot
{
int x, y, v;
};
dot c[maxq];
struct ask
{
int x, y, a, b, c;
};
ask a[maxq];
int n, q;
int p;
int num;
int ans[maxq];
int id[maxq], tmp[maxq];
bool lr[maxq];
int tr[maxn][maxn];
inline void Ins(int x, int y, int z)
{
for(int i = x; i <= n; i += i & -i)
for(int j = y; j <= n; j += j & -j)
tr[i][j] += z;
}
inline int Ask(int x, int y)
{
int sum = ;
for(int i = x; i; i -= i & -i)
for(int j = y; j; j -= j & -j)
sum += tr[i][j];
return sum;
}
inline void Two(int x, int y, int l, int r)
{
if(x > y) return;
if(l == r)
{
for(int i = x; i <= y; ++i) ans[id[i]] = r;
return;
}
int mi = l + r >> ;
while(c[p + ].v <= mi) ++p, Ins(c[p].x, c[p].y, );
while(c[p].v > mi) Ins(c[p].x, c[p].y, -), --p;
int tot, cnt = ;
for(int i = x; i <= y; ++i)
{
int k = id[i];
tot = Ask(a[k].a, a[k].b) - Ask(a[k].a, a[k].y - ) - Ask(a[k].x - , a[k].b) + Ask(a[k].x - , a[k].y - );
if(tot >= a[k].c) lr[i] = true, ++cnt;
else lr[i] = false;
}
int le = x - , ri = x + cnt - ;
for(int i = x; i <= y; ++i)
if(lr[i]) tmp[++le] = id[i];
else tmp[++ri] = id[i];
for(int i = x; i <= y; ++i) id[i] = tmp[i];
Two(x, le, l, mi), Two(le + , ri, mi + , r);
}
inline bool rule(dot a, dot b)
{
return a.v < b.v;
}
int main()
{
Scan(n), Scan(q);
int val;
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
{
Scan(val);
c[++num] = (dot) {i, j, val};
}
sort(c + , c + + num, rule);
for(int i = ; i <= q; ++i)
Scan(a[i].x), Scan(a[i].y), Scan(a[i].a), Scan(a[i].b), Scan(a[i].c), id[i] = i;
Two(, q, , c[num].v);
for(int i = ; i <= q; ++i) printf("%d\n", ans[i]);
}

矩阵乘法 BZOJ 2738的更多相关文章

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

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

  2. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

  3. bzoj 2738 矩阵乘法

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

  4. BZOJ 2738: 矩阵乘法 [整体二分]

    给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 愚蠢的名字...... 整体二分,影响因子就是矩阵里的数 把$\le mid$的矩阵元素加到二维树状数组里然后询问分成两组就行 ...

  5. [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

    题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...

  6. [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】

    题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...

  7. [BZOJ 1875] [SDOI 2009] HH去散步【矩阵乘法】

    题目链接:BZOJ - 1875 题目分析: 这道题如果去掉“不会立刻沿着刚刚走来的路走回”的限制,直接用邻接矩阵跑矩阵乘法就可以了.然而现在加了这个限制,建图的方式就要做一些改变.如果我们把每一条边 ...

  8. bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1009 [题意] 给定一个字符串T,问长度为n且不包含串T的字符串有多少种. [思路] ...

  9. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

随机推荐

  1. myeclipse报错MA

    以下问题萌新问了我很多次了,无奈写个随笔.之后问的我都在这个随笔里补充. 断电/自动关机导致的问题: Could not open the editor: the file does not exis ...

  2. C#背景图片自适应

    1.选中窗体修改属性 2.在load添加代码 private void Form1_Load(object sender, EventArgs e) { this.BackgroundImageLay ...

  3. 设置与使用SQL Server的字符集(Collation,即排序规则)

    目录 目录 正确认识SQL Server的字符集 选择合适的SQL Server字符集 错误使用SQL Server的字符集 参考资料 正确认识SQL Server的字符集 SQL Server作为一 ...

  4. spring-security中的csrf防御机制(跨域请求伪造)

    什么是csrf? csrf又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点.CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社 ...

  5. Mac如何让调整窗口大小更简单

    在使用Mac的时候,你能把鼠标的光标悬停在任何程序的边缘,当光标自动变成箭头样式后,按住鼠标左键你将能随意拖动来改变程序窗口的大小.但是,这里有个问题,我们有时候很难控制把鼠标光标移动在正确的窗口边缘 ...

  6. VC-基础:关于一些符号的意义

    GUI应用程序:Graphic User Interface图形 用户 接口 SDI:单文档程序(典型的记事本就是SDI) MID:多文档程序(比如VS2008默认就是多文档的)

  7. fclose - 关闭流

    SYNOPSIS 总览 #include <stdio.h> int fclose(FILE *stream); DESCRIPTION 描述 函数 fclose 将名为 stream 的 ...

  8. Ibatis入门基本语法

    1.       Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...

  9. rocketmq 命令示例

    http://www.360doc.com/content/16/0111/17/1073512_527143896.shtml http://www.cnblogs.com/marcotan/p/4 ...

  10. ios之UISplitViewController

    iPad的屏幕比iPhone大,所以在界面上,iPad比iPhone多一个UISplitViewController,用来实现iPad在横屏时,分两栏显示所需要的界面,可以一边是目录一边是具体的内容. ...