当前位置: 首页 > 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.gsyq.cn/news/156648.html

相关文章:

  • CreamInstaller游戏DLC解锁工具完整使用指南:轻松解锁付费内容
  • 终极Minecraft存档转换指南:快速实现跨平台无缝迁移
  • 常见单词回顾
  • YOLOv10半监督学习实战:用10%标注数据实现95%检测精度
  • 当用户在浏览器地址输入栏输入一个url并回车后的过程,请描述。
  • 微信小程序二维码生成终极指南:快速上手weapp-qrcode库
  • 【Open-AutoGLM配置MCP终极指南】:手把手教你5步完成高效部署
  • 本地语音合成系统实战:从零构建你的专属AI配音助手
  • 2025年高性价比的新型高效木炭机工厂排行榜,推荐新型高效木炭机公司 - mypinpai
  • 5分钟掌握游戏DLC解锁终极指南:免费工具完整解决方案
  • 终极指南:如何通过Sequential Thinking MCP Server实现高效思维管理的10个关键步骤
  • PaddlePaddle镜像在心理咨询聊天机器人中的探索
  • 新手必看的multisim14.0安装教程避坑指南
  • PaddlePaddle镜像中的故事连贯性控制机制
  • 2025口碑好的隔热条品牌推荐:多腔体/节能型厂家深度测评,甄选靠谱供应商助力门窗厂降本增效 - 工业品牌热点
  • 探索科立干冰清洗机:专业品质铸就良好口碑 - 工业品网
  • 1、使用Zappa构建无服务器Python Web服务
  • 21、C++ 函数式编程全解析
  • 2、AWS Lambda:无服务器计算的全面指南
  • 2025南京家装公司TOP5权威推荐:家装公司哪家强? - myqiye
  • 干冰机品牌推荐:宁波科立干冰科技 - 工业设备
  • Chrome音乐实验室:在浏览器中开启你的音乐创作之旅
  • PaddlePaddle镜像中的符号逻辑与神经网络融合
  • 科立干冰清洗设备:质量可靠,评价优良,调试便捷 - 工业品网
  • 【Open-AutoGLM使用全指南】:从零入门到高效应用的5大核心技巧
  • 电子书转有声书终极指南:3步搞定专业级有声读物制作
  • Yarn Spinner游戏对话创作:从技术困境到叙事突破的完整解决方案
  • http复习1
  • 5、使用Zappa构建Flask应用程序
  • GitHub Desktop中文汉化完整指南:3步实现完美本地化体验