P5607 [Ynoi2013] 无力回天 NOI2017 题解

news/2026/1/17 6:11:42/文章来源:https://www.cnblogs.com/WangNoNo/p/19423598

一道很好的题,如果做法不当(像我)可能需要一些卡常。

Part 1. bitset 20tps

插入?并集? \(1e5\) ?显然可以用 \(bitset\) 维护:

  • 每次修改把第 \(x\)\(bitset\) 中的第 \(y\) 位修改成1
  • 每次查询将 \(x1\)\(x2\) 两个 \(bitset\) 取或求1的个数即可

这样可以轻松获得20tps。

Code

const int N = 1e5 + 5;int m;
bitset<N> b[N];
void solve(){cin >> m;while(m--){ll opt, x, y; cin >> opt >> x >> y;if(opt == 1){b[x][y] = 1;}else{cout << (b[x] | b[y]).count() << "\n";}}
}

Part 2. 哈希表 34tps

考虑其实只需要维护两两之间的答案,最多 \(m\)

  • 每次修改把所有修改过 \(y\) 的和当前的集合间的交集大小加1,并记录每个集合的大小
  • 每次查询将两个集合相加减去并集即可

这样可以轻松获得34tps。(注:pb_ds哈希表使用方法在最后)

Code

const int N = 1e6 + 5;int m, maxn, siz[N];
cc_hash_table<int, int> ans[N];
vector<int> vc[N];void solve(){cin >> m;for(int i = 1; i <= m; i++){int opt, x, y; cin >> opt >> x >> y;if(opt == 1){++siz[x];int x0, x1;for(int num : vc[y]){x0 = x, x1 = num;if(x0 > x1) swap(x0, x1);++ans[x0][x1];}vc[y].pb(x);}else{if(x == y){cout << siz[x] << "\n";continue;}if(x > y) swap(x, y);int ans1 = ans[x][y];cout << siz[x] + siz[y] - ans1<< "\n";}}
}

Part 3. 正解 100tps

我们思考,

  • \(bitset\) 的优势在于高效处理多次出现,缺点是空间开不下
  • 哈希表的优势在于空间小,缺点是多次出现时会TLE

怎么办呢?考虑结合以上两种做法,对于多次出现交给 \(bitset\) 处理,其他数据由空间小的哈希表处理。

具体的,考虑进行根号分治,设临界值为 \(B\) ,记 \(x\) 的出现次数为 \(cnt_x\) ,对于每个数 \(x\)

  • \(cnt_x<B\) ,用哈希表处理
  • \(cnt_x>B\) ,用 \(bitset\) 处理

考虑到 \(bitset\) 的复杂度,当 \(B=\sqrt{m/w}\)时达到理论最优值

直接写完你就会发现MLE,怎么办?只需要改成出生可可爱爱の指针就可以了!

Code

const int N = 1e6 + 5, B = 8192, B1 = N / B;int m, maxn, siz[N];
struct node{int opt, x, y;
} q[N];
bitset<B> *b[N];
cc_hash_table<int, int> *ans[N];
vector<int> vc[N];
int cnt[N], f[N], tot;void init(){cin >> m;for(int i = 1; i <= m; i++){cin >> q[i].opt >> q[i].x >> q[i].y;if(q[i].opt == 1) ++cnt[q[i].y];else if(q[i].x > q[i].y) swap(q[i].x, q[i].y);}for(int i = 1; i <= m; i++) if(cnt[i] > B1) f[i] = ++tot; maxn = tot;for(int i = 1; i <= m; i++) if(cnt[i] <= B1) f[i] = ++tot;for(int i = 1; i <= m; i++) if(q[i].opt == 1) q[i].y = f[q[i].y];for(int i = 1; i <= m; i++) if(q[i].opt == 2){if(!ans[q[i].x]) ans[q[i].x] = new cc_hash_table<int, int>();(*ans[q[i].x])[q[i].y] = 0;}
}
void solve(){for(int i = 1; i <= m; i++){if(q[i].opt == 1){++siz[q[i].x];if(q[i].y <= maxn){if(!b[q[i].x]) b[q[i].x] = new bitset<B>();(*b[q[i].x])[q[i].y] = 1;}else{int x0, x1;if(vc[q[i].y].size() != 0){for(int num : vc[q[i].y]){x0 = q[i].x, x1 = num;if(x0 > x1) swap(x0, x1);if(!ans[x0]) continue;if(ans[x0] -> find(x1) != ans[x0] -> end()) ++(*ans[x0])[x1];}}vc[q[i].y].pb(q[i].x);}}else{if(q[i].x == q[i].y){cout << siz[q[i].x] << "\n";continue;}int ans1 = (*ans[q[i].x])[q[i].y], ans2 = 0;if(b[q[i].x] && b[q[i].y]) ans2 = (*b[q[i].x] & *b[q[i].y]).count();cout << siz[q[i].x] + siz[q[i].y] - ans1 - ans2 << "\n";}}
}

Part 4. 补充

pb_ds使用须知:

请使用以下头文件

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/priority_queue.hpp>
#include<ext/pb_ds/exception.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#include<ext/pb_ds/list_update_policy.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/trie_policy.hpp>
using namespace __gnu_pbds;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1098102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机Java毕设实战-基于SpringBoot的房屋租赁系统的设计与实现基于Springboot的房屋租赁网站的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

CSDN年度技术趋势预测

CSDN技术趋势预测概览CSDN作为国内知名的开发者社区&#xff0c;每年会基于行业动态、用户行为及专家分析发布技术趋势预测。以下是综合多方信息整理的2023年重点关注领域&#xff1a;人工智能与机器学习生成式AI&#xff08;如ChatGPT、Stable Diffusion&#xff09;持续爆发&…

官网-城乡居民医疗保险报销政策

官网:2023年宿迁市基本医疗保险待遇政策一览表-宿迁市人民政府 一、居民医保门诊报销政策 (一)普通门诊 就诊机构 起付线(元) 报销比例 待遇范围 单日处方限额 年度限额(元) 乡镇一级医院、村居卫生机构 0 55% 合规药费 乡镇一级医院100元;村居卫生机构30元 300 城区…

去掉手写字上面的表格线

截取手写字的时候,有些人的字与表格重叠了,把表格也截出来了,需要去掉。 方法:右击用画图打开,直接点橡皮擦,擦掉就可以了

读书笔记9-12.18

第九章主要讲的是估算,也就是在项目开始前,对时间、资源、成本等做一个大致的预测。作者认为,估算不是瞎猜,而是一种需要学习和练习的技能。估算能帮你避免意外,比如老板问你“这个功能多久能做完?”,如果你随口…

2025辽宁最新汽车装饰品牌top5推荐!沈阳等地区高品质服务厂商权威榜单发布,赋能汽车后市场新生态 - 全局中转站

随着汽车后市场消费升级,高品质汽车装饰及隐形车衣成为车主守护爱车的核心需求。本榜单基于技术实力、产品品质、服务网络、区域适配性四大维度,结合东北汽车后市场协会数据及车主口碑调研,权威解析2025年五大汽车装…

Java毕设项目:基于SpringBoot的学校图书管理系统设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

读书笔记9-12.18

第九章主要讲的是估算,也就是在项目开始前,对时间、资源、成本等做一个大致的预测。作者认为,估算不是瞎猜,而是一种需要学习和练习的技能。估算能帮你避免意外,比如老板问你“这个功能多久能做完?”,如果你随口…

计算机Java毕设实战-基于SpringBoot的学校图书管理系统设计与实现基于Vue和SpringBoot的图书管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

实操-失业保险金申领

一、领取条件(必须同时满足) 1.缴费满1年 失业前用人单位和本人累计缴纳失业保险费满12个月(含)以上。 2.非本人意愿中断就业 需与用人单位沟通,在社保系统停保时,一定要勾选【非本人自愿离职】选项(如协商一致)。 用人单位在社保系统停保后,个人才能进行失业登记…

临时文件自动化管理方案

临时文件自动化管理方案使用脚本定期清理编写脚本&#xff08;如Python或Shell&#xff09;定期扫描指定目录&#xff0c;删除超过设定天数的临时文件。Python示例&#xff1a;import os import timedef clean_temp_files(directory, days_threshold):current_time time.time(…

读书笔记8-12.11

这一章的核心思想大概就是,一个成功的项目不仅仅是代码的堆砌,更是一个系统工程。它强调了团队协作、流程自动化和持续改进的重要性。作者认为,团队应该像注重实效的程序员一样,遵循相同的原则,例如不留下“破窗”…

polar-ctf 简单(web)

1. 简单Rce看到题目代码过滤了一些关键字符cat tac 和system都被过滤了&#xff0c;不能再去使用。但是可以利用vi命令进行读取flag执行外部命令函数&#xff1a;system()、passthru()、exec()2. seek flag进入题目找找flag。在cookie中将id改成1&#xff0c;得到了第一段flag在…

2021hychs 一试模拟题解析

\[\huge {{\text{2021hychs} 一试模拟题解析}} \]一、填空题 1. \(\color{red}1027182\) 由 \(0<a_1<a_2\) 归纳易知数列 \(\{a_n\}\) 为单调递增的正数列,从而: \[2a_{2n+1}=a_{2n}+a_{2n+2}=\sqrt{a_{2n-1}a…

【课程设计/毕业设计】基于springboot的图书管理系统基于SpringBoot的学校图书管理系统设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

不用额外花时间!眼调节训练灯,破解儿童近视度数递增难题

各位家长&#xff0c;是不是发现孩子的近视度数一年比一年高&#xff1f;去年还是100度&#xff0c;今年验光就涨到200度&#xff0c;更让人焦虑的是&#xff0c;明明每天都提醒“少看会儿书”“多出去走走”&#xff0c;可度数还是拦不住地涨。一、为啥孩子近视度数总涨&#…

LangGraph MultiAgent 智能书籍写作系统

LangGraph MultiAgent 智能书籍写作系统 文章目录 LangGraph MultiAgent 智能书籍写作系统 LangGraph MultiAgent 书籍写作系统 系统架构图 完整代码 运行说明 1. 安装依赖 2. 配置 API Key 3. 运行程序 4. 输入主题 输出示例 示例运行输出: 系统特点 =======================…

HTTP在参考模型中的哪一层

HTTP 协议位于 TCP/IP 五层模型的应用层,同时也对应 OSI 七层模型的应用层。 具体的层级关联和协议特点可以分为两点来看: 对应 TCP/IP 五层模型这是实际网络通信中最常用的分层标准,HTTP 属于最顶层的应用层,作用…

计算机Java毕设实战-基于springboot+vue的车辆配件进销存平台设计和实现基于SpringBoot的汽车配件仓储管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

学长亲荐8个AI论文工具,本科生毕业论文轻松搞定!

学长亲荐8个AI论文工具&#xff0c;本科生毕业论文轻松搞定&#xff01; AI 工具助力论文写作&#xff0c;让毕业不再焦虑 对于本科生来说&#xff0c;撰写毕业论文是一次不小的挑战。从选题、资料收集、大纲搭建到初稿撰写、修改润色&#xff0c;每一个环节都可能让人感到手足…