CF573C Bear and Drawing 构造+树论

正解:构造

解题报告:

传送门!

这题首先可以画下图找下规律,,,然后通过找规律可以发现,最终的方案一定是一条主干+一些枝条,而且这些枝条的分杈一定小于等于2

明确一下主干的定义,最左边的节点和最右边的节点之间的路径为主干

如图

强行证明一下吼,,,

因为是两排平行的“钉子板”

所以如果一个分枝点想要有超过2个儿子结点

因为在同侧最多有两条边

就一定要往另一边伸至少一条边

这样就因为这条边挡住了一侧(比如说左侧)

那么剩下的边只能往右侧伸展了

那它向另一侧伸的边伸出的子树中的叶子节点一定有一个是最左边的节点

那最左边的节点的路径一定要经过它

所以它就在最左边的节点到最右边的节点的路上

它就是主干不是分枝辣

然后就考虑,我怎么找哪个是杈哪个是主干呐

那就从叶子节点开始,把链减下来,剩下的不是主干就是分杈点

然后就看,如果这个点麻油被减下来的邻居只有一个,说明那它就是分叉点或者主干点的最侧端

然后最后判断一下484所有主干的邻居主干点都小于等于2就好辣!

然后等下放代码!

over!

原文地址:https://www.cnblogs.com/lqsukida/p/10357143.html

时间: 2024-11-13 08:19:07

CF573C Bear and Drawing 构造+树论的相关文章

简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树

第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树.  本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰.  坏处是:节点较多的时候,性能可能不够好.不能直接查询到节点的深度level.当然,如果需要level字段,在递归过程中,是可以计算得到的.关于在递归过程中,计算level,后面有介绍这种方法. 关于树的遍历和查找,大家都有基础,上面描述了一些总体思路,代码中有注释,基本就不用再详细介绍了. /

简洁常用权限系统的设计与实现(五):不维护节点的深度level,手动计算level,构造树

这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与第三篇中的方法,完全一样.因此,本篇和下一篇,只介绍如何计算level,不再介绍后面的具体实现了. 计算level,采用递归方式. // 计算所有节点的level public static List<Map<String, Object>> caculateLevel( List<

简洁常用权限系统的设计与实现(七):一种错误的不可行的构造树的方法

前面介绍了4种方法(实质是3种),构造树. 在此,需要特别说明的是,那些都是成功的.漂亮的方法和案例 ,但实际上在解决问题的过程中,有很多其它的尝试.比如本篇介绍的方法,就是不可行的.  想说明一个道理,在走向成功的道路上,会经历很多不算太成功的事情. 我们在前面的例子中,用递归计算子结点的深度level.但实际上,我最开始想到的一种方法正好反过来了. 思路:最底层的节点level为1,如果当前节点有父结点,就把自己的level+1,递归把自己的父结点的level+1. // 计算所有节点的le

纯CSS构造树状结构图

<!doctype html> <html> <head> <meta charset="utf-8"> <title>纯CSS构造树状结构图</title> </head> <body> <div style="width:380px; height:600px; border:1px dashed gray; margin:30px auto; text-align:ce

根据 中序遍历 和 后序遍历构造树(Presentation)(C++)

好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找一下链接出来...... 1127. ZigZagging on a Tree (30):https://www.patest.cn/contests/pat-a-practise/1127 突然想起以前学数据结构的时候如果给出一个中序遍历和一个后序遍历然后让你画出树的结构或求出先序遍历之类的题目,

E. Bear and Drawing

time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Limak is a little bear who learns to draw. People usually start with houses, fences and flowers but why would bears do it? Limak lives in the

codeforces 1041 E. Tree Reconstruction 和度数有关的构造树

CF 1041E:http://codeforces.com/contest/1041/problem/E 题意: 告诉你一个树的节点个数,显然有n-1条边.已知去掉一条边后,两个集合中最大的节点值.问原来的树形状是怎么样的,构造不出来就输出NO. 思路: 这里说的“度数”可能有点不恰当.指以这个点引出一条链的长度,链上点的值小于这个点. 我想着这应该是可以作为一条链的,但是一直没有想到向节点度数上去想.首先,输入的一对值中,有一个一定是等于n的,那另一个值我们给它度数++.我们把度数为0的点从

CF-div3-611-F. DIY Garland 优先队列 构造树

思路 参考队友博客:https://www.cnblogs.com/AaronChang/p/12129861.html 思考如何构造一个树:(亮度低与重要度低)的二者匹配: 什么时候重要度低,就叶节点开始(从下到上). 所以,从叶节点出发,往上构造,度数为0的就是叶节点加入优先队列,与重要度从小到大相匹配. 代码 #include<bits/stdc++.h> using namespace std; typedef long long ll; /* 思考如何构造一个树:权值小的先匹配,什么

Codeforces573C. Bear and Drawing

http://codeforces.com/problemset/problem/573/C 给一颗树,问是否能画在两行平行的点格图上(无限长),边长随意,不能相交. #include<bits/stdc++.h> const int maxn=1e5+15; using namespace std; vector<int> g[maxn]; int n,leg[maxn]; bool mark[maxn]; void init(){ scanf("%d",&a