首页 > 代码库 > Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined)
Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined)
A题,水题,判断所有点是不是入度和出度都相同即可。
B题, 题意搞懂了就是水题。
C题。一方分数mod k以后有余数,那么另外一方至少需要赢一场。根据这个方法判断即可。
D题,构造题,不会= =。
E题,题意是每次可以选一个节点,把儿子的两条相同长度的链合并成新的一条相同长度的链。问最后是否可以成为一条直链,如果可以输出最短的长度。见代码即可:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <set> 5 #include <iostream> 6 #include <vector> 7 using namespace std; 8 const int N = 2e5 + 5; 9 10 int n,root; 11 vector<int> G[N]; 12 int dfs(int u,int fa) 13 { 14 set<int> S; 15 for(int i=0;i<G[u].size();i++) 16 { 17 int v = G[u][i]; 18 if(v == fa) continue; 19 int t = dfs(v,u); 20 if(t == -1) return -1; 21 S.insert(t + 1); 22 } 23 if(S.size() == 0) return 0; 24 if(S.size() == 1) return *S.begin(); 25 if(S.size() == 2 && fa == -1) return *S.begin() + *S.rbegin(); 26 root = u; 27 return -1; 28 } 29 30 int main() 31 { 32 cin >> n; 33 for(int i=1;i<n;i++) 34 { 35 int u,v; scanf("%d%d",&u,&v); 36 G[u].push_back(v); 37 G[v].push_back(u); 38 } 39 int ans = dfs(1,-1); 40 if(ans == -1) ans = dfs(root,-1); 41 if(ans == -1) return 0*puts("-1"); 42 while(ans % 2 == 0) ans >>= 1; 43 printf("%d\n",ans); 44 return 0; 45 }
Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。