LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】
思路
首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少
然后这个可以两次dfs来DP处理
然后就试图确定中序遍历的第一个节点
一定是siz<=2的编号最小的节点
这样肯定是最小的
那么来考虑从这个节点向右上和右下方扩展整棵树
一定是不能向左上或左下,不然就不优秀了
如果当前节点右除了左下有两个儿子,那么最小值小的放在右下,递归处理,大的放在右上,递归处理
如果只有一个儿子,就比较儿子和当前节点的大小并递归处理就可以了
好题啊
//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
typedef pair<int, int> pi;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
const int N = 1e6 + 10;
int n, siz[N];
int ans[N], now[N], cnt;
int f[N][4], ch[N][4], anc[N];
int dfs1(int u, int fa) {
int res = INF_of_int;
fu(i, 1, siz[u]) {
int v = ch[u][i];
if (v == fa) {
anc[u] = i;
continue;
}
f[u][i] = dfs1(v, u);
res = min(res, f[u][i]);
}
if (siz[u] == 1 && fa) return u;
if (siz[u] == 2 && fa) return min(u, res);
return res;
}
void dfs2(int u) {
int minv = INF_of_int, fa = ch[u][anc[u]];
fu(i, 1, siz[fa]) {
int v = ch[fa][i];
if (v == u) continue;
minv = min(minv, f[fa][i]);
}
if (siz[fa] <= 2) minv = min(minv, fa);
f[u][anc[u]] = minv;
fu(i, 1, siz[u]) {
int v = ch[u][i];
if (v == fa) continue;
dfs2(v);
}
}
void getnow(int u, int fa) {
pi tmp[4];
int ind = 0;
fu(i, 1, siz[u]) {
int v = ch[u][i];
if (v == fa) continue;
tmp[++ind] = pi(f[u][i], i);
}
if (!ind) {
ans[++cnt] = u;
return;
}
sort(tmp + 1, tmp + ind + 1);
if (ind == 1) {
if (f[u][tmp[1].second] < u) {
getnow(ch[u][tmp[1].second], u);
ans[++cnt] = u;
} else {
ans[++cnt] = u;
getnow(ch[u][tmp[1].second], u);
}
} else {
getnow(ch[u][tmp[1].second], u);
ans[++cnt] = u;
getnow(ch[u][tmp[2].second], u);
}
}
void solve(int u, int fro) {
ans[++cnt] = u;
pi tmp[4];
int ind = 0;
fu(i, 1, siz[u]) {
int v = ch[u][i];
if (v == fro) continue;
tmp[++ind] = pi(f[u][i], i);
}
if (!ind) return;
sort(tmp + 1, tmp + ind + 1);
if (ind == 1) {
int nxt = ch[u][tmp[1].second];
int minv = INF_of_int;
fu(i, 1, siz[nxt])
if (ch[nxt][i] != u) minv = min(minv, f[nxt][i]);
if (minv < nxt) {
getnow(nxt, u);
} else {
solve(nxt, u);
}
} else {
getnow(ch[u][tmp[1].second], u);
solve(ch[u][tmp[2].second], u);
}
}
int main() {
Read(n);
fu(i, 1, n) {
Read(siz[i]);
fu(j, 1, siz[i]) Read(ch[i][j]);
}
dfs1(1, 0);
dfs2(1);
fu(i, 1, n) ans[i] = n;
int pos = 0;
fu(i, 1, n)
if (siz[i] <= 2) {pos = i; break;}
solve(pos, 0);
fu(i, 1, n) {
Write(ans[i]);
putchar(' ');
}
return 0;
}
LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】的更多相关文章
- loj2324 「清华集训 2017」小 Y 和二叉树
https://loj.ac/problem/2324 太智障,一开始以为中序遍历的第一个点一定是一个叶子,想了个贪心.然而,手算了一下,第一个点都过不了啊. input 5 2 3 4 1 3 3 ...
- LOJ2324「清华集训 2017」小Y和二叉树
题目链接 瞎jb贪一发就过了.首先度数<=2且编号最小的点一定是中序遍历最靠前的点,我们从这个点开始dfs一遍算出子树中度数<=2且编号最小的点记为\(f(i)\),然后从这个点开始一步一 ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- [LOJ#2324]「清华集训 2017」小Y和二叉树
[LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...
- loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主
#2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 "A fight? Co ...
- [LOJ#2323]「清华集训 2017」小Y和地铁
[LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...
- 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法
题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...
- LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)
哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \ ...
- LOJ2325. 「清华集训 2017」小 Y 和恐怖的奴隶主【矩阵快速幂优化DP】【倍增优化】
LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都 ...
随机推荐
- 用svg实现不规则形状
像这种弧形,用纯html和css很难写,但是用svg就简单多了. 可以用作图工具画出一个弧形,然后导成svg格式.在页面中,下面的白块就是div+svg构成 mixin svgCard(...cont ...
- 【转】爬取豆瓣电影top250提取电影分类进行数据分析
一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...
- SSM整合报错org.springframework.beans.factory.UnsatisfiedDependencyException
我解决的办法是把.m2仓库所有文件删除,重新maven project就可以了. 但是在做这一步之前,报错如下: ①org.springframework.beans.factory.Unsatisf ...
- ADC第一次读取
在ADCCON中,最后0位和1位互斥.如果1位选1的话,0位的值无效.如果1位选0的话,0位的值才有效.当1位选1的话:这是应用层的程序 #if ADSTART==0void niuniu(void) ...
- APP Inventor 基于网络微服务器的即时通信APP
APP Inventor 基于网络微服务器的即时通信APP 一.总结 一句话总结:(超低配版的QQ,逃~) 1.APP Inventor是什么? google 傻瓜式 编程 手机 app App In ...
- [转]基于Visual Studio 2010 进行敏捷/Scrum模式开发
http://www.infoq.com/cn/articles/visual-studio-2010-agile-scrum-development 根据Forrester Research今年第二 ...
- hdu3863找规律
先画一下N=2的情况,先手胜,再画一下N=3的情况,先手胜,所以大胆的猜测,无论N=多少,先手胜!! 这也能A真是个奇迹 #include<map> #include<set> ...
- SpringMVC之ModelAndView的 jsp值在浏览页面不显示
Tomcat运行后浏览器上显示的结果! <%@ page isELIgnored="false" %>改变后问spring mvc开发过程中, 经常会给model ad ...
- linux杀毒软件clamav安装与使用
#clamav安装与使用 ###第一步:Clamav下载http://www.clamav.net/downloads wget http://www.clamav.net/downloads/pro ...
- IOS-APP前需要考虑的几件事
做一个 App 前需要考虑的几件事 来源:Limboy's HQ 链接:http://t.cn/R5sEDMJ 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了. ...