BZOJ 4813

虽然数据范围很迷人,但是想树形$dp$没有前途。

先发现一个事情,就是我们可以先选择一条链,最后要走到这一条链上不回来,走到链上的点每一个只需要一步,而如果要走这条链之外的点,一个点需要走两步。

这条链怎么选取?为了尽量减少步数,肯定是最长链。

现在有了一个显然的事情,如果限制步数$stp$不比最长链长度$mx$大的话,那么直接在最长链上走一走就好了,答案为$stp + 1$。

一棵树最少需要$mx + 2 * (n - mx - 1) = 2n - mx - 2$步走完,如果$stp$不小于这个值,那么一定能走完,答案为$n$。

剩下的情况只要先考虑走完最长链然后尽量分配步数到别的点上去就好了,答案为$mx + 1 + \left \lfloor \frac{stp - mx}{2} \right \rfloor$。

时间复杂度$O(n)$。

应该也有$dp$的办法吧。

Code:

#include <cstdio>
#include <cstring>
using namespace std;const int N = 105;int n, stp, tot = 0, head[N], dep[N];struct Edge {int to, nxt;
} e[N << 1];inline void add(int from, int to) {e[++tot].to = to;e[tot].nxt = head[from];head[from] = tot;
}inline void read(int &X) {X = 0; char ch = 0; int op = 1;for(; ch > '9' || ch < '0'; ch = getchar())if(ch == '-') op = -1;for(; ch >= '0' && ch <= '9'; ch = getchar())X = (X << 3) + (X << 1) + ch - 48;X *= op;
}inline void chkMax(int &x, int y) {if(y > x) x = y;
}void dfs(int x, int fat, int depth) {dep[x] = depth;for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if(y == fat) continue;dfs(y, x, depth + 1);}
}int main() {read(n), read(stp);for(int x, y, i = 1; i < n; i++) {read(x), read(y);++x, ++y;add(x, y), add(y, x);}dfs(1, 0, 1);int mx = 0;for(int i = 1; i <= n; i++)chkMax(mx, dep[i] - 1);if(stp <= mx) return printf("%d\n", stp + 1), 0;if(stp >= 2 * n - mx - 2) return printf("%d\n", n), 0;printf("%d\n", mx + 1 + (stp - mx) / 2);return 0;
}

View Code

转载于:https://www.cnblogs.com/CzxingcHen/p/9852755.html

Luogu 3698 [CQOI2017]小Q的棋盘相关推荐

  1. [bzoj4813][Cqoi2017]小Q的棋盘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V ...

  2. BZOJ 4814 Luogu P3699 [CQOI2017]小Q的草稿 (计算几何、扫描线、set)

    题目链接 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id=4814 (Luogu) https://www.luogu.org/problem/P ...

  3. bzoj 4813: [Cqoi2017]小Q的棋盘【树形dp】

    这么简单的dp我怎么没想到x2 f为从这个点出发后回到这个点最多能走过的点,g为从这个点出发后不回到这个点最多能走过的点,注意g有两种转移:g[u][k]=max(g[u][k],f[u][k-j-1 ...

  4. [CQOI2017]小Q的棋盘

    输入输出样例 输入样例#1: 5 2 1 0 2 1 3 2 4 3 输出样例#1: 3 输入样例#2: 9 5 0 1 0 2 2 6 4 2 8 1 1 3 3 7 3 5 输出样例#2: 5 说 ...

  5. BZOJ 4813: [Cqoi2017]小Q的棋盘 (树形dp)

    题目传送门 Solution 树形背包dp大水题,是POJ某道题的弱化版...不想说了,据说贪心也能过此题.. 一开始50分,dp数组初始化炸了,表示无语.. Code #include <io ...

  6. P3700 [CQOI2017]小Q的表格(反演、分块)

    P3700 [CQOI2017]小Q的表格 给定一个大小为n×nn \times nn×n的表格,初始时i,ji, ji,j位置上填的是f(i,j)=i×jf(i, j) = i \times jf( ...

  7. [CQOI2017]小Q的表格(数论+分块)

    题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...

  8. [CQOI2017] 小Q的表格(分块 + 整除分块 + 数学 + 前缀和)

    problem luogu-P3700 solution f(a,b)=f(b,a)f(a,b)=f(b,a)f(a,b)=f(b,a) 意味着我们只用考虑半个棋盘的信息. b∗f(a,a+b)=(a ...

  9. P3698-[CQOI2017]小Q的棋盘【树形dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3698 题目大意 nnn个点的树,求从111出发走kkk步最多能到多少个节点.(重复走不算) 解题思路 做法与树形 ...

最新文章

  1. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)...
  2. Html5页面和Native App怎么进行交互
  3. 【转载】关于幂律分布的一个笔记
  4. 富人和穷人的对比图,时刻提醒自己!
  5. POJ3461 【KMP(粗糙模板)】
  6. presto查询报错
  7. 9月| R社区原创作者免费赠书
  8. 数据挖掘导论课后习题答案 第二章(一)
  9. 海森矩阵的特征值和特征向量的物理意义推导
  10. 网络流量监控iptraf
  11. 百度AI车牌识别测试
  12. 前端笔记 -- 不重复造轮子(遇到就更新内容)
  13. 《Loy解说Eureka服务端源码(二)》
  14. Tracup:集成Bug追踪的轻量级项目管理平台
  15. ggplot2-标度、坐标轴和图例7
  16. xctf攻防世界 CRYPTO高手进阶区 wtc_rsa_bbq
  17. Winows通过非445端口远程访问公网Samba
  18. 洛谷P1162 填涂颜色(Python搜索)
  19. Stata:手动计算和图示边际效应
  20. c#和python更适合爬虫_Python2和Python3哪个更适合初学者学习来爬虫

热门文章

  1. tensorboard : 无法将“tensorboard”项识别为 cmdlet、函数、脚本文件或可运行 程序的名称。
  2. 11.Excel数据分析-复合型饼图与漏斗图
  3. java 反射解析xml_java反射获取xml元素
  4. Maven依赖管理和插件配置
  5. 【计算机组成原理】十进制数串
  6. html中flash的使用,[转载]flash中可以使用的HTML标签[有用]
  7. 洛谷 P 4180 次小生成树
  8. Zookeeper集群搭建(配置详解)
  9. 浅聊一下各类以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII
  10. leetcode刷题 74.搜索二维矩阵