CodeForces #318 (div1) C.Bear and Drawing
2015-08-30 20:21
246 查看
题目大意:
2*n的点阵,问能否画出题中给出的树,且树边不交叉。
解题思路:
一开始不会……后来问了老司机……
分成四种点进行讨论。
![](http://img.blog.csdn.net/20150830201755090?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
所有叶子节点都是4,然后向上递推。
至于如何寻找根节点:
因为第一种节点最多只有一个,所以先把默认的1号点当根来搜叶子标四号点。
这样的话,如果递推出了好多个①点,那就是no。
如果只递推出了一个①点,那这个①点就是根。
就以递推出来的①点为根重新做一遍dp,看看是否满足条件。
如果连①点都没搜出来的话,就说明随便当根怎么画都能满足条件了。就肯定是yes。
后来在cf的提交里看到了个特别有意思的代码……
过了但是我看不懂……求老司机教教我……
2*n的点阵,问能否画出题中给出的树,且树边不交叉。
解题思路:
一开始不会……后来问了老司机……
分成四种点进行讨论。
所有叶子节点都是4,然后向上递推。
至于如何寻找根节点:
因为第一种节点最多只有一个,所以先把默认的1号点当根来搜叶子标四号点。
这样的话,如果递推出了好多个①点,那就是no。
如果只递推出了一个①点,那这个①点就是根。
就以递推出来的①点为根重新做一遍dp,看看是否满足条件。
如果连①点都没搜出来的话,就说明随便当根怎么画都能满足条件了。就肯定是yes。
后来在cf的提交里看到了个特别有意思的代码……
过了但是我看不懂……求老司机教教我……
/* ────────────────────────────────────── ─▄▄▄───────────▄▄▄▄▄▄▄──────────────── █▀░▀█──────▄▀▀▀░░░░░░░▀▀▄▄──────────── █░░░░█───▄▀░░░░░░░░░░░░░░░▀▄───────▄▄▄ █▄░░░▀▄▄▀░░██░░░░░░░░░░░░░░▀█────█▀▀░█ ─█░░░░█▀░░░▀░░░░░░░░██░░░░░░▀█─▄█░░░░█ ─▀█░░▄█░░░░░░░▄▄▄░░░░▀░░░░░░░███░░░░█▀ ──█▄░█░░░░░▄███████▄░░░░░░░░░█▀░░░░▄▀─ ──▀█░█░░░░▄██████████░░░░░░░▄█░░░░▄▀── ───███░░░░███████████░░░░░░▄█░░░░█▀─── ────█░░░░░██████████▀░░░░░░█░░░░█▀──── ────█░░░░░░▀███████▀░░░░░░░█▄▄▄▀────── ────█░░░░░░░░▀▀▀▀░░░░░░░░░░░▀█──────── ────█░░░░░░░░░░░░░░░░░░░░░░░░█──────── ────█░░░░░░░░░░░░░░░░░░░░░░░░█──────── ────█░░░░░░░░░░░░░░░░░░░░░░░░█──────── ────────────────────────────────────── ───█──█─█──█─█──█─█▀▀▀█─█▀▀█─█──█───── ───█▀▀█─█──█─█▄▄█─█───█─█────█──█───── ───█──█─█▄▄█────█─█▄▄▄█─█▄▄█─█▄▄█───── ────────────────────────────────────── */ #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<set> #define LL long long #define db double #define EPS 1e-15 #define inf 1000000000 #define pa pair<int,int> #include <iostream> #include <set> #define w *v[a].begin() #define f(b) for(int a=1;a<=b;a++) #define m 100005 using namespace std; int n,p,q,x[m],y[m],z[m],o; set<int> v[m]; void d(int a){ if(z[a]||y[a]||x[a]>2)return; if(x[a]<2)x[w]++; else y[w]=1; v[w].erase(a); if(v[w].size()==1)d(w); z[a]=1; } int main(){ cin>>n; f(n-1){ cin>>p>>q; v[p].insert(q); v[q].insert(p); } f(n)if(v[a].size()==1)d(a); f(n)if(!z[a]&&v[a].size()>2)o=1; if(o)cout<<"No"; else cout<<"Yes"; return 0; }
相关文章推荐
- Python2.7获取QQ空间好友头像
- noj1057
- Android线程的相关使用
- CodeForces 527B Error Correct System
- CodeForces 552C Vanya and Scales
- HDU1162-Eddy's picture-最小生成树(prim算法模板)
- 项目开发计划——机房收费系统
- 哈夫曼树 C语言实现 原创下改正
- CodeForces 471C MUH and House of Cards
- 关于数组的实验
- 新的班级,新的生活
- 新的班级,新的生活
- 服务器端查看问题
- Ubuntu12.04下minicom配置,与ARM通信
- HDU 4458 Shoot the Airplane (2012年杭州赛区现场赛F题)
- Codeforces Round #318(Div. 2) A
- CodeForces 508C Anya and Ghosts
- CodeForces 496B Secret Combination
- CodeForces 483B Friends and Presents
- Android开发详解之onTouch和onClick详解