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的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都 ...
随机推荐
- 01_HBase概述
1. HBase在Hadoop生态圈中的位置 问题:HBase 是什么,用在哪里,解决什么样的问题? 解答: 1)简单来说, HBase 是一种类似于面向列的分布式数据库(集群), 底层利用HDFS ...
- 测试mysql
sysbench 测试mysql TODO emacs
- java的时间获取
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. currentTimeMillis方法 public static long currentTim ...
- jQuery实际案例⑥——图片跟随鼠标、五角星评分案例
一.图片跟随鼠标移动 1.要求:鼠标移动到哪,图片就要跟到哪 2.用到的事件:首先监听鼠标:$(document).mousemove(function(event){ }); //此时可以获取鼠标距 ...
- 树 & 二叉树
2018-01-04 19:13:46 一.树 在计算机科学中,树(英语:tree)是一种数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系的集合.把 ...
- Ubuntu下配置Nginx+PHP
1.安装Nginxapt-get install nginx 2.启动Nginxservice nginx start 3.访问服务器IP 如果看到“Welcome to nginx!”说明安装好了. ...
- 1029: [JSOI2007]建筑抢修 贪心
https://www.lydsy.com/JudgeOnline/problem.php?id=1029 题意:n个建筑,每个有修复时间和爆炸时间,没有在爆炸时间内修复就会爆炸,问最多能修复的建筑 ...
- 重新学习MySQL数据库1:无废话MySQL入门
重新学习Mysql数据库1:无废话MySQL入门 开始使用 我下面所有的SQL语句是基于MySQL 5.6+运行. MySQL 为关系型数据库(Relational Database Manageme ...
- RabbitMQ消息队列(九)RPC开始应用吧
一 简单应用 RPC——远程过程调用,通过网络调用运行在另一台计算机上的程序的函数\方法,是构建分布式程序的一种方式.RabbitMQ是一个消息队列系统,可以在程序之间收发消息.利用RabbitMQ可 ...
- TLS就是SSL的升级版+网络安全——一图看懂HTTPS建立过程——本质上就是引入第三方监管,web服务器需要先生成公钥和私钥,去CA申请,https通信时候浏览器会去CA校验CA证书的有效性
起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL是基于 ...