B. Road Construction
题意:给定n个城市让修路,两两城市之间的路没有限制的话都可以修,使得每个城市都可以通过走最多两条路到达另一个城市, 然后给定m条限制说这些路不能修。
思路:突破点在于 m < n 2 m<\frac n 2 m<2n ,意味着必然存在某个点和其他点都可以连边。以这个点为根发现树只有两层,可以满足 “最多两条路到达另一个城市” 的条件,且只有 n - 1 条边。
AC代码:https://codeforces.com/contest/330/submission/156283768
D. Diverse Garland
略。
AC代码:https://codeforces.com/contest/1108/submission/156285298
C. Friends and Gifts
题意:
n ( n ≤ 2 × 1 0 5 ) n(n≤2×10^5) n(n≤2×105) 个人互相送礼物,每一个人需要向别人送出一个礼物,同时自己可以收到一个礼物。
如果第 i ( 1 ≤ i ≤ n ) i\;(1 \le i \le n) i(1≤i≤n) 个人想要送给第 j j j 个人礼物,那么 f i = j f_i=j fi=j;但如果第 i i i 个人并未选好送给谁,那么 f i = 0 f_i=0 fi=0。
现在给出所有的 f i f_i fi,请帮助 f i = 0 f_i=0 fi=0 的人选好送礼对象,使得每一个人都送出一个礼物,且收到一个礼物,保证题目有解。
思路:把没有发出礼物和没有收到礼物的分为两组,然后匹配即可。注意自环的情况,我的处理方法是排序,然后看看是否某一位相等,相等的话和序列末交换即可。这里 有 O ( n ) O(n) O(n) 的匹配方法。
AC代码:https://codeforces.com/contest/1283/submission/156286649
C. Chocolate Bunny
题意:交互题。有一个前 n n n 个正整数的排列,每次询问 x , y x,y x,y 得到 a x m o d a y a_x \bmod a_y axmoday 的值,最多使用 2 n 2n 2n 次询问,猜出这个序列。
第一次做这种交互题,挺有意思的。
- 注意把
#define endl '\n'
注释掉。可以ios
解绑。 - 按照格式输出询问,询问答案就会放到缓冲区。记得及时
cout << endl;
清理缓冲区。
思路:
突破点就是 a m o d b a \bmod b amodb 和 b m o d a b \bmod a bmoda 。
如果 a > b a>b a>b ,那么 a m o d b < b , b m o d a = b a \bmod b < b, b \bmod a = b amodb<b,bmoda=b ,根据两次询问就可以猜出来一个数。
AC代码:https://codeforces.com/contest/1407/submission/156288325
C. Link Cut Centroids
题意:给定一棵节点数为 n n n 的树 , 删一条边然后加上一条边 , 使得该树的重心唯一 。(删掉的边和加上的边可以是同一条)
思路:讨论当重心不唯一(有两个重心时)的情况。找到某个叶子节点,把他接到离他更远的那个重心上即可。正确性不会证。
定义:
树的直径:树上的最长简单路。(两次BFS\DFS 或 树形 DP)
树的重心:定义每个点的点权为:每颗子树的大小的最大值,或者为其他点到该点的总距离。则点权最小的点就是重心(最多两个)。(DFS)
树的中心:定义每个点的点权为:子节点到达该点的最长路径。则点权最小的点就是中心(最多两个)。(两次BFS\DFS 或 树形 DP)
AC代码:https://codeforces.com/contest/1406/submission/156292176