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

P5607 [Ynoi2013] 无力回天 NOI2017 题解

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

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.jsqmd.com/news/167647/

相关文章:

  • 【计算机毕业设计案例】基于SpringBoot的学校图书管理系统设计与实现图书管理、借阅记录、审核借阅、图书续借、审核续借、确认归还(程序+文档+讲解+定制)
  • CSDN年度技术趋势预测
  • 官网-城乡居民医疗保险报销政策
  • 去掉手写字上面的表格线
  • LangGraph MultiAgent 智能书籍写作系统
  • 读书笔记9-12.18
  • 读书笔记9-12.18
  • 计算机Java毕设实战-基于SpringBoot的学校图书管理系统设计与实现基于Vue和SpringBoot的图书管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 实操-失业保险金申领
  • 2021hychs 一试模拟题解析
  • 读书笔记8-12.11
  • 不用额外花时间!眼调节训练灯,破解儿童近视度数递增难题
  • 计算机Java毕设实战-基于springboot+vue的车辆配件进销存平台设计和实现基于SpringBoot的汽车配件仓储管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 官网-中华人民共和国个人所得税法
  • 2021hychs 一试模拟题
  • 调节力的秘密!你知道吗?调节力在日常生活中非常重要
  • 亚马逊卖家站外引流:猎豹移动与主流Meta广告代理商服务选型参考 - 智造出海
  • Java毕设项目推荐-基于Spring Boot与MySQL的二手车销售管理系统的设计与实现基于Java和Spring Boot的二手车交易系统设计与实现【附源码+文档,调试定制服务】
  • Java计算机毕设之基于SpringBoot的汽车配件仓储管理系统设计与实现配件信息、供应商、库存、采购、销售(完整前后端代码+说明文档+LW,调试定制等)
  • 京东多智能体综合设计——多源异构数据采集与融合应用综合实践
  • [Quicker] 蓝奏云API - 源码归档
  • Java毕设选题推荐:基于SpringBoot的“鲜蔬坊”蔬菜销售平台基于springboot的水果蔬菜生鲜商城系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 【毕业设计】基于SpringBoot的学校图书管理系统设计与实现(源码+文档+远程调试,全bao定制等)
  • 2025辽宁最新汽车装饰品牌top5推荐!沈阳等地区高品质服务厂商权威榜单发布,赋能汽车后市场新生态 - 全局中转站
  • Miniconda-Python3.10镜像如何支持最新版PyTorch 2.x?
  • 福育未来人口监测与预测系统 个人项目汇报 102302138林楚涵
  • Django框架核心MVT(模型/视图/模板)入门完整教程
  • 【课程设计/毕业设计】基于springboot的水果蔬菜生鲜商城系统基于SpringBoot的“鲜蔬坊”蔬菜销售平台【附源码、数据库、万字文档】
  • QQ音乐加密mgg,ogg转mp3下载
  • Java毕设项目:基于SpringBoot的学校图书管理系统设计与实现(源码+文档,讲解、调试运行,定制等)