矩阵乘法 BZOJ 2738
矩阵乘法
【问题描述】
【输入格式】
第一行两个数N,Q,表示矩阵大小和询问组数;
接下来N行N列一共N*N个数,表示这个矩阵;
再接下来Q行每行5个数描述一个询问:x1,y1,x2,y2,k表示找到以(x1,y1)为左上角、以(x2,y2)为右下角的子矩形中的第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的更多相关文章
- [BZOJ 2738] 矩阵乘法 【分块】
题目链接:BZOJ - 2738 题目分析 题目名称 “矩阵乘法” 与题目内容没有任何关系..就像VFK的 A+B Problem 一样.. 题目大意是给定一个矩阵,有许多询问,每次询问一个子矩阵中的 ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
- bzoj 2738 矩阵乘法
其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...
- BZOJ 2738: 矩阵乘法 [整体二分]
给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 愚蠢的名字...... 整体二分,影响因子就是矩阵里的数 把$\le mid$的矩阵元素加到二维树状数组里然后询问分成两组就行 ...
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...
- [BZOJ 2326] [HNOI2011] 数学作业 【矩阵乘法】
题目链接:BZOJ - 2326 题目分析 数据范围达到了 10^18 ,显然需要矩阵乘法了! 可以发现,向数字尾部添加一个数字 x 的过程就是 Num = Num * 10^k + x .其中 k ...
- [BZOJ 1875] [SDOI 2009] HH去散步【矩阵乘法】
题目链接:BZOJ - 1875 题目分析: 这道题如果去掉“不会立刻沿着刚刚走来的路走回”的限制,直接用邻接矩阵跑矩阵乘法就可以了.然而现在加了这个限制,建图的方式就要做一些改变.如果我们把每一条边 ...
- bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1009 [题意] 给定一个字符串T,问长度为n且不包含串T的字符串有多少种. [思路] ...
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ...
随机推荐
- 在Windows笔记本上调试运行在iOS设备上的前端应用
我在每天工作中需要在不同的移动设备上测试我们开发的前端应用是否正常工作,比如iOS设备和Android设备.我用的工作笔记本电脑又是Lenovo的,安装的是Windows操作系统. 有的时候一个开发好 ...
- ABC3D创客项目:小风扇
风扇是我们纳凉的好帮手,然而大多的风扇都体积庞大不易携带.利用电池进行供电能让风扇变得更加便捷,下面我们利用电池供电的原理制作出一个风扇. 工作原理: 这个OK风扇的主要能源来自于后面的7号电池,风扇 ...
- mysql 存在更新,不存在插入
String sql = "insert into wb_result " + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ...
- 题解 P5082 【成绩】
随机跳题跳到了这一题,一看是个红题,本蒟蒻就 艰难地思考起来 高兴地写起来 这题实在不能用数组,用了数组就RE 一开始就卡在这上面了 说实话,这道题真的 很难 不算很难,只要照着公式往上面套就行了 废 ...
- OpenCV2:第十一章 图像转换
一.简介 二.例子 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #inclu ...
- cdlinux
xset q xset s 6000 xset -dpms ntpdate time.nist.gov date
- linux——nmap端口扫描命令
先安装 nmap :apt-get install nmap 端口扫描命令nmap -sS 172.16.55.100nmap -Pn 172.16.55.100第一组渗透测试指令,用于情报收集. 要 ...
- 用事件队列解决GUI的操作顺序问题(Qt中处理方法)
GUI操作顺序问题引发异常: 有时候我们使用写GUI程序的时候会遇到这样的问题:比如在程序中,建立了一个列表的GUI.这个列表是随着时间不断更新的,而且操作也会读取这个列表GUI的内容. 如果这个程序 ...
- luogu P2574 XOR的艺术 (线段树)
luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...
- (43)zabbix报警媒介介绍
zabbix触发器到了要发送通知的情况下,需要一个中间介质来接收并传递它的消息给运维们,以往用nagios,通常用脚本发送邮件或者发送飞信来达到报警.这个脚本实际上就是一个媒介了. zabbix有如下 ...