19JXCPC
2019CCPC-江西省赛(重现赛)- 感谢南昌大学
1001.Cotree
题目思路:
又是我换根大法的展现时间
首先来了解一个知识点啊,树的重心
树的重心:
- 树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样。
- 把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上。
- 一棵树添加或者删除一个节点,树的重心最多只移动一条边的位置。
- 一棵树最多有两个重心,且相邻
重点是第一条
偷一下题解
其实题解里的u1,u2就是俩棵树的重心
答案组成包括了俩部分
一部分是原本树内俩俩点之间的最小距离,这是不变的
另一部分是俩起来之后俩个树的点对
就是题解说的那三种情况
显然节点个数我们没法改变,所以就是找到树的重心
然后怎么找呢,换根!!!!!!
定义size[n](和题解里的没关系)为n所有子节点的个数
dp[n]为节点n的所有子节点到n的距离之和
所以我们的dp[n] = dp[i] (i为n的儿子) + size[n]
分别用
casize计算出子节点的个数
dfs_dpfirst计算出任意一个根的dp[n]
dfsfindroot分离出俩颗树,算出每颗树的节点个数
dfs_rerooting换根dp的核心,见以往博客
然后我们根据换根的原理,可以发现,在每一次换根之后,都会得到根节点到所有其他节点的距离和,全部加起来就是树内俩俩点之间的最小距离的和的二倍,除二就可以了
这样俩部分就都求出来了
题目代码:
1 |
|
1004.Wave
题目思路:
把每一个数字n出现的位置记录下来
然后枚举pair(i,j)就是序列的数字
然后按照位置交替放,找到最长的
题目代码:
1 | /*-------------------------------------------------------------------------------------------*/ |
1006.String
记住每个字母有几个
乘一下,gcd一下,就好了
1007.Traffic
这个题意一点也不清楚,枚举题意
题意是说b车都等着,最少要等多少秒,然后出发不会和a相遇
就记住a车的时间,枚举b等待时间,看会不会相遇就可以
1008.Rng
概率看我:
这个不算ac了
就是获取到一些知识
相交的区间比较多,所以我们可以想到算不相交的
错误:然后在比赛的时候我们算的不是概率,而是去算的不相交的区间个数,这种做法是错误的,因为选取到每一个区间的概率是不相同的,当选取了右端点,第二次选左端点的概率是不同的的
例如1,2,3
选到[2,2]区间的概率是1/3 * 1/2 而选到[3,3]区间的概率为1/3 * 1/3(1/n * 1/r)
这里附上别人的题解:题解传送门
第二行两个线段,左边的圈位置可以取的值我称为左圈值,右边的圈的位置可以取的值我称为右圈值,不考虑相交时,左圈值可以是1,2,。。n,右圈值同理,故有n*n中情况,在考虑相交时,左圈值可以取1,2,3。。。n-1,此时右圈值对应可以取n-1个,n-2个,n-3个。。。1个,所以总的情况有n-1 + n-2 + n-3 +。。+1(即1->n求和),所以概率就是上面列的那个式子
(见传送门评论区)
1009.Budget
一开始还以为这个是考的四舍五入
然而a是很大的,考的是字符串了,只要看最后一位小数是大于4还是小于4就好了
1010.Worker
先算出所有仓库订单的最小公倍数k
然后计算出每个仓库订单达到k所需要的工人之和sum
题中所给的人数必须是此sum的倍数,然后就顺序输出就行,按比例分配工人
1011.Class
小学题