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

[CEOI 2017] Mousetrap

挺有意思的一道题。

记毛毛虫为一条路径上除了底部所有点的不在路径上的子节点与该节点形成的边集。

首先设陷阱为根 \(rt\) 可以简化问题。

假设 \(m\)\(rt\) 的儿子,则老鼠只会走到 \(m\) 的二儿子,大概流程就是先走到底,然后管理员把路径上毛毛虫的边都堵住,这样一定比老鼠回来路上走过去优,然后再清理这条路径送老鼠进陷阱。设 \(f_u\) 表示从 \(u\) 开始再赶回 \(u\) 的最小操作数,那么管理员肯定在老鼠没开始走的时候就堵住 \(f_v\) 最大的 \(v\),于是老鼠选次大的走,即 \(f_u = \text{2ndmax}f_v + son_u\),因为所有子节点都会被操作一次,\(v\) 是清理其它是堵住。

但是如果 \(m\) 不是 \(rt\) 儿子就不一样了,老鼠可以先向上走到一个点 \(u\),再找一个 \(u\) 的儿子 \(v\) 走,那还要多堵 \(u\)\(rt\) 路径上毛毛虫的边,记为 \(sum_u\),显然 \(sum_u = sum_{fa_u} + son_u - [u \neq m]\)。那么操作次数就是 \(sum_u + f_v\)

这个东西不是很好贪心或 DP,又发现答案有单调性,于是可以二分答案,老鼠每次上去前就有一次操作可以堵一个老鼠没走过的 \(v\),如果不能堵了就不合法。会堵一个 \(v\) 当且仅当 \(sum_u + f_v >\) 当前操作次数。

时间复杂度 \(\mathcal{O}(n \log n)\)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
// typedef __int128 i128;
typedef pair<int, int> pii;
const int N = 1e6 + 10, mod = 998244353;
template<typename T>
void dbg(const T &t) { cout << t << endl; }
template<typename Type, typename... Types>
void dbg(const Type& arg, const Types&... args) {cout << arg << ' ';dbg(args...);
}
namespace Loop1st {
int n, rt, m, fa[N], f[N], sum[N], son[N], b[N];
basic_string<int>e[N];
void dfs(int u) {int mx = 0, cmx = 0;for (int v : e[u]) if (v != fa[u]) {fa[v] = u;son[u]++;dfs(v);if (f[v] > mx) cmx = mx, mx = f[v];else if (f[v] > cmx) cmx = f[v];}f[u] = cmx + son[u];
}
bool check(int x) {int cnt = 1;for (int u = m; u != rt; u = fa[u], cnt++) {int val = 0;for (int v : e[u]) if (v != fa[u] && !b[v] && f[v] + sum[u] > x) {if (!cnt) return 0;val++; cnt--;}x -= val;}return x >= 0;
}
void main() {cin >> n >> rt >> m;for (int i = 1, u, v; i < n; i++) {cin >> u >> v;e[u] += v; e[v] += u;}dfs(rt);for (int u = 1; u <= n; u++) sum[u] = sum[fa[u]] + son[u] - 1 + (u == m); for (int u = m; u != rt; u = fa[u]) b[u] = 1;int L = -1, R = n * 2 + 1;while (L + 1 < R) {int mid = (L + R) >> 1;if (check(mid)) R = mid;else L = mid;}cout << R << '\n';
}}
int main() {// freopen("data.in", "r", stdin);// freopen("data.out", "w", stdout);ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int T = 1;// cin >> T;while (T--) Loop1st::main();return 0;
}
http://www.jsqmd.com/news/142479/

相关文章:

  • PaddlePaddle镜像支持的跨领域对话迁移
  • CreamInstaller游戏DLC解锁工具完整使用指南:轻松解锁付费内容
  • 终极指南:3分钟学会CreamApi自动DLC解锁工具
  • AI时代代码质量提升实战指南:别让效率成为质量的敌人
  • PaddlePaddle镜像支持的多轮对话状态跟踪
  • 擅长强制执行律师哪家专业?宁波TOP5推荐与选择指南 - 工业品牌热点
  • Realtek RTL8125驱动终极配置指南:简单快速实现2.5G网络性能最大化
  • 终极Minecraft存档转换指南:快速实现跨平台无缝迁移
  • NetBox拓扑视图终极指南:3分钟构建专业级网络架构图
  • 常见单词回顾
  • 2025年木炭机公司推荐,高性价比的新型木炭机工厂全解析及口碑排行 - 工业推荐榜
  • 毕设分享 基于大数据的共享单车数据分析与可视化
  • 干冰清洗机源头厂家、推荐厂商、资深厂商大揭秘 - 工业品网
  • PaddlePaddle镜像在政府公文处理中的提效方案
  • 终极Sublime代码高亮方案:Monokai Extended深度解析
  • 5分钟掌握Auto-Py-To-Exe:零基础将Python脚本变成EXE文件
  • YOLOv10半监督学习实战:用10%标注数据实现95%检测精度
  • fiddler如何修改网页title?
  • 当用户在浏览器地址输入栏输入一个url并回车后的过程,请描述。
  • 2025年北京岩板楼梯推荐厂商排名,岩板楼梯厂家专业定制全解析 - mypinpai
  • PaddlePaddle镜像中的版权规避与原创保障
  • 轻松掌握B站音频提取:downkyicore超详细使用指南
  • MusicFree桌面歌词功能终极排查指南:7个步骤解决所有问题
  • 微信小程序二维码生成终极指南:快速上手weapp-qrcode库
  • 【Open-AutoGLM配置MCP终极指南】:手把手教你5步完成高效部署
  • 2025年义乌专升本辅导机构推荐,靠谱的义乌专升本机构选择哪家好 - myqiye
  • WindiskWriter:macOS上制作Windows启动盘的终极神器
  • 本地语音合成系统实战:从零构建你的专属AI配音助手
  • 5分钟掌握游戏DLC解锁终极指南:免费工具完整解决方案
  • 2025年高性价比的新型高效木炭机工厂排行榜,推荐新型高效木炭机公司 - mypinpai