当前位置: 首页 > news >正文

P9497 「RiOI-2」weight

记录146

#include<bits/stdc++.h> using namespace std; #define ll long long // 防止数据溢出,使用long long //n*n的矩阵,n是1e3 ,所以N是1e6 const int N=1e6+5; ll a[N],n,q,cnt; // a数组存储打平后的矩阵,cnt记录总数字个数 // 从大到小排序的比较函数 bool cmp(ll a,ll b) { return a>b; } //因为每一行都可以“任意重排”,这就意味着我们拥有极大的自由度。我们可以把矩阵中所有 ≥v的数字像发牌一样,尽可能均匀地分配到不同的列里去。 int main() { ios::sync_with_stdio(false); // 关闭同步,加速IO cin.tie(0); cin>>n>>q; // 1. 读入矩阵并打平成一维数组 for(ll i=1;i<=n;i++) { for(ll j=1;j<=n;j++) { cin>>a[++cnt]; } } // 2. 预处理:从大到小排序 sort(a+1,a+cnt+1,cmp); // 3. 处理每次询问 while(q--) { ll x; cin>>x; ll ans=0,l=1,r=cnt; // 手写二分查找:寻找最后一个 >= x 的位置 while(l<=r) { ll mid=(l+r)/2; if(a[mid]<x) { r=mid-1; // 中间值小于x,说明答案在左边 } else { l=mid+1; // 中间值>=x,更新答案并向右寻找 ans=mid; } } // 满足条件的数字个数不能超过矩阵的列数 n cout<<min(ans,n)<<"\n"; } return 0; }

题目传送门https://www.luogu.com.cn/problem/P9497


前言

我是一名专注信奥赛(CSP-J/S、NOIP)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的CSDN账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

代码分块详细解释

1. 头文件、常量与全局变量定义

#include<bits/stdc++.h> using namespace std; #define ll long long // 防止数据溢出,使用 long long // n*n的矩阵,n是1e3,所以总元素个数是1e6 const int N=1e6+5; ll a[N], n, q, cnt; // a数组存储打平后的矩阵,cnt记录总数字个数
  • 详细分析:矩阵的最大规模是 10^3×10^3=10^6 ,因此数组大小需要开到 10^6级别。由于矩阵中的数值和阈值 vv 最高可达 10^9 ,为了防止潜在的溢出风险,代码统一使用了long long类型。cnt变量用于在读取矩阵时充当一维数组的索引计数器。

2. 排序比较函数

// 从大到小排序的比较函数 bool cmp(ll a, ll b) { return a > b; }
  • 详细分析:标准库的sort默认是升序排列。为了方便后续的二分查找(我们希望 ≥v≥v 的数字集中在数组的前端),这里自定义了一个降序排列的比较函数。

3. 主函数:输入处理与预处理

int main() { ios::sync_with_stdio(false); // 关闭同步,加速IO cin.tie(0); cin >> n >> q; // 1. 读入矩阵并打平成一维数组 for(ll i = 1; i <= n; i++) { for(ll j = 1; j <= n; j++) { cin >> a[++cnt]; } } // 2. 预处理:从大到小排序 sort(a + 1, a + cnt + 1, cmp);
  • 详细分析:这部分完成了核心的预处理。通过双重循环将二维矩阵的 n^2个元素全部读入一维数组a中。随后调用sort进行降序排序。这一步的时间复杂度是 O(n2log⁡n2) ,由于只执行一次,完全可以接受。

4. 核心逻辑:处理询问与手写二分

// 3. 处理每次询问 while(q--) { ll x; cin >> x; ll ans = 0, l = 1, r = cnt; // 手写二分查找:寻找最后一个 >= x 的位置 while(l <= r) { ll mid = (l + r) / 2; if(a[mid] < x) { r = mid - 1; // 中间值小于x,说明答案在左边 } else { l = mid + 1; // 中间值>=x,更新答案并向右寻找 ans = mid; } } // 满足条件的数字个数不能超过矩阵的列数 n cout << min(ans, n) << "\n"; } return 0; }
  • 详细分析:这是代码的灵魂部分,用于处理高达 5×1055×105 次的询问。
    • 手写二分:对于当前的阈值 xx ,我们需要找出数组中有多少个元素 ≥x≥x 。由于数组是降序的,所有 ≥x≥x 的元素会连续出现在数组的前端。二分查找的else分支(a[mid] >= x)会不断向右推进l,并用ans记录下当前满足条件的最右位置。循环结束后,ans就是 ≥x≥x 的元素总个数。
    • 贪心取最小值ans代表了理论上能凑出的最大列数。但如果ans > n(比如矩阵里全是 ≥x≥x 的大数,ans达到了 n2n2 ),受限于矩阵只有 nn 列,我们最多只能让 nn 列达标。因此,最终输出min(ans, n)

核心逻辑总结表

代码模块核心变量/操作精炼作用解决的痛点
矩阵打平cin >> a[++cnt]将二维矩阵转化为一维数组打破行列的物理限制,便于全局统计和排序
降序预处理sort(..., cmp)将数组按从大到小排列使得所有 ≥v≥v 的元素集中在数组前端,为二分查找提供单调性基础
http://www.jsqmd.com/news/1190416/

相关文章:

  • 2026年翻砂铸铜件/精密翻砂铸铜/手工砂模铸铜/潮模砂铸铜件/薄壁耐高温铸铜与批量量产实力供应厂家深度解析 - 甄选服务推荐
  • (2026最新)三亚防水补漏本地人必选的正规靠谱公司推荐-房屋漏水检测维修师傅上门-卫生间/厨房/阳台/房顶/外墙漏水检测精准测漏 - 即刻修防水
  • 2026浙江地区伺服超声波塑料焊接机厂家资质深度评测 - 奔跑123
  • 别再傻用range了!enumerate才是Python重塑循环的神器
  • 2026佛山地区企业GEO获客正规公司排行一览 - 奔跑123
  • 2026年7月最新温州卡地亚官方售后联系电话与客户服务中心网点地址 - 卡地亚服务中心
  • JBoltAI V5.0核心能力解析
  • 商业PPT怎么写才专业?我踩过的坑和偷懒技巧全在这了
  • 2026年重庆户外广告优质媒体服务商参考排行 - 奔跑123
  • 2026年工业品网络推广技术解析与靠谱服务商指南 - 奔跑123
  • P10098 [ROIR 2023] 地铁建设 (Day 2)
  • 上下文工程:Agent的长上下文、记忆管理与Token治理最佳实践
  • Java图片等比例压缩?别让清晰和大小把你逼疯
  • 2026年7月宁波全屋定制本地服务商选购参考 - 奔跑123
  • 大厂都在用的Git代码规范 - 智慧园区
  • 寄大件物流怎么排?上门取件性价比之选与比价攻略 - 生活情报姬
  • 2026年AI音乐生成工具行业主流服务商名录盘点 - 奔跑123
  • 华北赛道铺设情况
  • 【aigc】初识mediakit-cli 和 chatcut、远程 AI 能力的命令行代理
  • 2026年国内无极换型C型钢设备主流厂商排行名录 - 奔跑123
  • 【限时解密】ChatGPT私域社群GMV提升217%的底层逻辑:基于27个真实社群的NLP情感分析报告
  • AI编程会取代程序员吗:2026开发者技能优先级迁移与转型路线图
  • 2026年工业品网络推广技术拆解与靠谱服务商指南 - 奔跑123
  • 四个月速成AI工程师:薪资翻倍,转行者的黄金窗口期已开启!
  • 2026 年更新:佳木斯评价高的流水槽模具企业哪家好,揭秘:这个“槽”如何让你的产品销量暴涨? - 鉴选官
  • MLPnP 3D点到切平面的投影过程
  • 2026年国内AI一键翻唱工具主流服务商名录盘点 - 奔跑123
  • Java二分查找:别再傻傻遍历了,O(log n)效率直接封神
  • 2026年翻砂铸造优质工厂:东莞市肖铸五金制品有限公司-铝合金/生铁/湿型/干模/黏土/精密/重型翻砂铸钢生产厂家深度解析 - 甄选服务推荐
  • 亲身到店探访北京格拉苏蒂官方售后服务中心|详细官方热线及维修地址(2026年7月最新) - 亨得利钟表维修中心