D. Numbers on Tree(构造)【CF 1287】



思路:
我们需要抓住唯一的重要信息点"ci",我的做法也是在猜想和尝试中得出的,之后再验证算法的正确性。
我们在构造中发现,如果树上出现了相同的数字,则会让树的构造变得不清晰。
我们尝试用不同的数值a[1]~a[n]去构造树,我们唯一知道的信息就是"ci",如果a[1]~a[n] = 1~n(从小到大排序),则我们容易确定root的数值id[root] = a[c[root] + 1]。为什么?因为我们有1~n这n个数字,如果我们id[root] = a[c[root] + 1],则root下面的点,无论怎么放置这n-1个数字都满足c[root]。如果该root的左边第一个son节点的c[x] = t,则id[x]为第c[x] + 1个数字(因为id[root]被使用了)好像也行的通(红字带入也行得通),然后我按着从左开始的dfs序模拟,发现问题就解决了,这样的方法是行的通的。为什么?模拟了之后才发现,因为我们选的是不同的数字,我们如果按着从左的dfs序一个个的解决子树,只要有足够的不同数字,则该方法一定是可以构造出当前子树的信息(带入红字理解),即子树之间独立不影响。用这个构造方法之前只需要先判断下所有的ci是不是合法,即该点下面如果只有x个数字,c[now]>x就是不合法的。代码下面有个样例,模拟下就理解了。
1 #include <iostream>
2 #include <algorithm>
3 #include <cstdio>
4 #include <cstring>
5 #include <queue>
6 #include <string>
7 #include <map>
8 #include <set>
9
10 using namespace std;
11
12 const int N = 2e3 + 10;
13 vector<int > E[N];
14 set<int > hav;
15 int son[N], id[N];
16 int error;
17
18 int fun (int now, int pre)
19 {
20 int sn = 0;
21 for(auto to : E[now]) {
22 if(to == pre) continue;
23 sn += fun(to, now);
24 }
25
26 if(son[now] - 1 > sn) error = 1;
27 return sn + 1;
28 }
29
30 void dfs (int now, int pre)
31 {
32 if(son[now] > hav.size()) { error = 1; return; }
33 else {
34 int tot = 0;
35 for(auto& x: hav) {
36 ++tot;
37 if(tot == son[now]) {
38 id[now] = x;
39 // cout << x << endl;
40 hav.erase(x);
41 break;
42 }
43 }
44 }
45
46 for(auto to : E[now]) {
47 if(to == pre) continue;
48 dfs(to, now);
49 if(error) return;
50 }
51 }
52
53 void solve()
54 {
55 int n, root;
56 scanf("%d", &n);
57 for(int i = 1; i <= n; ++i) {
58 int x, cnt;
59 scanf("%d%d", &x, &cnt);
60 if(x != 0) {
61 E[i].push_back(x);
62 E[x].push_back(i);
63 } else root = i;
64 son[i] = cnt + 1;
65 }
66
67 for(int i = 1; i <= n; ++i) { hav.insert(i); }
68
69 error = 0;
70 fun(root, 0);
71 if(error) {
72 printf("NO\n");
73 return;
74 }
75 dfs(root, 0);
76 if(error) { printf("NO\n"); }
77 else {
78 printf("YES\n");
79 for(int i = 1; i <= n; ++i) { printf("%d ", id[i]); }
80 printf("\n");
81 }
82 }
83
84 int main()
85 {
86
87 solve();
88
89 return 0;
90 }
91 /*
92 13
93 0 5
94 1 2
95 2 0
96 2 1
97 4 0
98 4 1
99 6 0
100 6 0
101 1 1
102 9 0
103 9 2
104 11 0
105 11 0
106
107 */
D. Numbers on Tree(构造)【CF 1287】的更多相关文章
- UVA10006 - Carmichael Numbers(筛选构造素数表+高速幂)
UVA10006 - Carmichael Numbers(筛选构造素数表+高速幂) 题目链接 题目大意:假设有一个合数.然后它满足随意大于1小于n的整数a, 满足a^n%n = a;这种合数叫做Ca ...
- HDU 5573 Binary Tree 构造
Binary Tree 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5573 Description The Old Frog King lives ...
- Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
B. Invariance of Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/576/ ...
- AIM Tech Round 4 (Div. 1) C - Upgrading Tree 构造 + 树的重心
C - Upgrading Tree 我发现我构造题好弱啊啊啊. 很明显能想到先找到重心, 然后我们的目标就是把所有点接到重心的儿子上,让重心的儿子子树变成菊花图, 这个先把重心到儿子的边连到 i , ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
- CF1129E Legendary Tree 构造
传送门 神树可还行 我们令\(1\)为树根,那么如果要询问\(x\)是否在\(y\)子树中,就令\(S = \{1\} , T = \{x\} , u = y\),询问一下就可以知道了. 那么考虑先构 ...
- [CF1311E] Construct the Binary Tree - 构造
Solution 预处理出 \(i\) 个点组成的二叉树的最大答案和最小答案 递归做,由于只需要构造一种方案,我们让左子树大小能小就小,因此每次从小到大枚举左子树的点数并检验,如果检验通过就选定之 现 ...
- Dividing the numbers CodeForces - 899C (构造)
大意: 求将[1,n]划分成两个集合, 且两集合的和的差尽量小. 和/2为偶数最小差一定为0, 和/2为奇数一定为1. 显然可以通过某个前缀和删去一个数得到. #include <iostrea ...
- 2015多校第7场 HDU 5379 Mahjong tree 构造,DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 题意:一颗n个节点n-1条边的树,现在要给每个节点标号(1~n),要求:(1)每一层的兄弟节点的 ...
随机推荐
- Linux 系统编程 学习:10-线程:线程的属性
Linux 系统编程 学习:10-线程:线程的属性 背景 上一讲我们介绍了线程的创建,回收与销毁:简单地提到了线程属性.这一讲我们就来具体看看,线程的属性. 概述 #include <pthre ...
- [Luogu P3455] [POI2007]ZAP-Queries (莫比乌斯反演 )
题面 传送门:洛咕 Solution 这题比这题不懂简单到哪里去了 好吧,我们来颓柿子. 为了防止重名,以下所有柿子中的\(x\)既是题目中的\(d\) 为了方便讨论,以下柿子均假设\(b>=a ...
- Photoshop如何安装蓝湖插件
Photoshop如何安装蓝湖插件 下载蓝湖插件 直通车:蓝湖Photoshop插件: Photoshop版本要求为cc2017以上, 下载后是一个zip格式的文件,我们需要解压. 下载的文件 解压后 ...
- (C#2,.net framework2.0,Visual Studio 2003)之前版本
(C#2,.net framework2.0,Visual Studio 2003)之前版本归为最初的版本(主要是针对.net framework),其主要定义了最基本的类型.特性. 1.基本的类型 ...
- n阶行列式的全排列求解(Java)
上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的 ...
- 4、Django之视图层
一 视图函数 视图函数,简称视图,属于Django的视图层,默认定义在views.py文件中,是用来处理web请求信息以及返回响应信息的函数,所以研究视图函数只需熟练掌握两个对象即可:请求对象(Htt ...
- php执行exec、xsell_exec命令失败
在php.ini下进行更改 查找disable_function 去掉exec xsell_exec 重启php
- 《Machine Learning in Action》—— 剖析支持向量机,优化SMO
<Machine Learning in Action>-- 剖析支持向量机,优化SMO 薄雾浓云愁永昼,瑞脑销金兽. 愁的很,上次不是更新了一篇关于支持向量机的文章嘛,<Machi ...
- SpringBoot第十集:i18n与Webjars的应用(2020最新最易懂)
SpringBoot第十集:i18n与Webjars的应用(2020最新最易懂) 一,页面国际化 i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符 ...
- quic是干什么的?
什么是quic? quic解决了什么问题?HTTP和QUIC QUIC :Quick UDP Internet Connections:是一种新的默认加密的互联网通信协议,它提供了许多改进,旨在加速H ...