Luogu1527[国家集训队]矩阵乘法
Luogu1527[国家集训队]矩阵乘法
题面:洛谷
解析
排名第\(k\)大,不妨考虑整体二分,二分第\(k\)大的数值\(mid\),,将大于\(mid\)的值视作1,添加到树状数组中,对每一个询问,判断它的询问区域中1的点的个数是否大于询问排名,即可将询问分作两部分递归,然而这样的复杂度是\(O(n^{2}\log{n})\),我们不妨将二分值域变为二分数值在矩阵中对应的排名,再先将矩阵中的数排序,就不用每一次都遍历整个矩阵找到大于\(mid\)的数了。
代码
// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#define N 505
#define M 60005
using namespace std;
int n,m,id[M],ans[M],t1[M],t2[M],tc;
struct Q{ int x1,y1,x2,y2,k; }q[M];
struct Mat{int v,x,y;bool operator < (const Mat& rhs) const { return v<rhs.v; }
}mat[N*N];
int a[N][N];
inline int In(){char c=getchar(); int x=0,ft=1;for(;c<'0'||c>'9';c=getchar()) if(c=='-') ft=-1;for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';return x*ft;
}
inline int LB(int x){return x&(-x);
}
inline void Add(int x,int y,int C){for(int i=x;i<=n;i+=LB(i))for(int j=y;j<=n;j+=LB(j))a[i][j]+=C;
}
inline int Sum(int x,int y){int s=0;for(int i=x;i;i-=LB(i))for(int j=y;j;j-=LB(j))s+=a[i][j];return s;
}
inline int Query(int x1,int y1,int x2,int y2){return Sum(x2,y2)-Sum(x1-1,y2)-Sum(x2,y1-1)+Sum(x1-1,y1-1);
}
void Solve(int l,int r,int ql,int qr){if(ql>qr) return;if(l==r){for(int i=ql;i<=qr;++i) ans[id[i]]=l;return;}int mid=(l+r)>>1,p1=0,p2=0;for(int i=l;i<=mid;++i) Add(mat[i].x,mat[i].y,1);for(int i=ql,u,s;i<=qr;++i){u=id[i]; s=Query(q[u].x1,q[u].y1,q[u].x2,q[u].y2);if(s>=q[u].k) t1[++p1]=u;else q[u].k-=s,t2[++p2]=u;}for(int i=l;i<=mid;++i) Add(mat[i].x,mat[i].y,-1);for(int i=ql;i<=ql+p1-1;++i) id[i]=t1[i-ql+1];for(int i=ql+p1;i<=qr;++i) id[i]=t2[i-ql-p1+1];Solve(l,mid,ql,ql+p1-1); Solve(mid+1,r,ql+p1,qr);
}
int main(){n=In(); m=In();for(int i=1;i<=n;++i) for(int j=1;j<=n;++j)mat[++tc].v=In(),mat[tc].x=i,mat[tc].y=j;sort(mat+1,mat+1+tc);for(int i=1;i<=m;++i){q[i].x1=In(); q[i].y1=In();q[i].x2=In(); q[i].y2=In();q[i].k=In(); id[i]=i;}Solve(1,n*n,1,m);for(int i=1;i<=m;++i) printf("%d\n",mat[ans[i]].v);return 0;
}
转载于:https://www.cnblogs.com/pkh68/p/10526726.html
Luogu1527[国家集训队]矩阵乘法相关推荐
- P1527 [国家集训队]矩阵乘法
P1527 [国家集训队]矩阵乘法 题意: 给你一个 n×n 的矩阵,每次询问一个子矩形的第 k 小数. 题解: 整体二分稍微加强化 模板题是一个序列,现在升级成一个矩阵求,做法和原理都是一样的 使用 ...
- 洛谷P1527 [国家集训队] 矩阵乘法 [整体二分,二维树状数组]
题目传送门 矩阵乘法 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入格式: 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N* ...
- P1527 [国家集训队]矩阵乘法 整体二分 + 二维树状数组
传送门 题意: 思路: 算是个整体二分的板子啦,不过这个是二维的矩阵,我们只需要把一位树状数组改成二维的,让后动态维护单点加,区间查询前缀和即可. //#pragma GCC optimize(2) ...
- 【洛谷1527】 [国家集训队]矩阵乘法(整体二分)
传送门 洛谷 Solution 考虑看到什么k小就整体二分套上去试一下. 矩形k小整体二分+二维树状数组就好了. 代码实现 // luogu-judger-enable-o2 /*mail: mlea ...
- Luogu4451 [国家集训队]整数的lqp拆分
题目链接:洛谷 题目大意:求对于所有$n$的拆分$a_i$,使得$\sum_{i=1}^ma_i=n$,$\prod_{i=1}^mf_{a_i}$之和.其中$f_i$为斐波那契数列的第$i$项. 数 ...
- zcmu-1184(矩阵乘法)
1184: 帮我求算一下斐波那契数吧 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 221 Solved: 42 [Submit][Status][ ...
- 国家集训队论文分类整理[转]
国家集训队论文分类整理 转自这里 dalao写的东西,是非常有学习价值的.反正noip不一定会用,但是对以后肯定有用的. 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用&g ...
- 国家集训队论文分类整理
国家集训队论文分类整理 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬 ...
- 国家集训队论文分类整理(转)
国家集训队论文分类整理 ----------转自https://www.cnblogs.com/AbandonZHANG/archive/2012/07/21/2601889.html 距离ACM/I ...
- 国家集训队论文集题目
这些论文还是很不错的,可以当成专题到谷歌上搜着看看,权当拓展下知识. 国家集训队1999论文集 陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 来煜坤:<把 ...
最新文章
- 网站优化之网站为什么要做301定向跳转?
- r语言 plot_R和Python的特点对比,这样你就知道该怎么选择了
- coffeeScript学习01
- 广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释
- 12个ggplot2扩展包帮你实现更强大的可视化
- HTML5中的自定义属性总结
- 浅说机器学习中“迭代法”
- shell 自动回车_macos开机自动屏蔽独显
- 水题总结NYOJ74,1094,60,975,111,833
- 将js对象转化为树形结构
- atitit.session的原理以及设计 java php实现的异同
- DGIOT实战教程——虚拟ModbusRTU接入
- Excel汇总的撤销整个工作表保护的2种操作方法!
- Debian10安装Chromium浏览器
- html表单界面设计,ui界面表单设计的三个方面
- hadoop is not in the sudoers file. This incident will be reported.问题解决
- 2020-12 补丁日: 微软多个高危漏洞通告
- java程序员面试自我介绍
- 如何在官网下载java JDK或JRE的历史版本
- 技术专业术语/专业名词 - 收集