Codeforces Round #566 (Div. 2)
Posted dqsssss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #566 (Div. 2)相关的知识,希望对你有一定的参考价值。
Codeforces Round #566 (Div. 2)
D
题意:给一棵无根树,求找到一个点为根使得同深度的点的度数相同。 \(n \le 10^5\)
key:讨论
考虑叶子:答案可能在直径中点(即树的中心)。除此之外答案只能是一个一度点。
check完树的中心之后,若不是,考虑应该以哪个叶子为根。
首先要以树中心为根统计一下每个叶子的深度,叶子至多被划分为两个深度,否则则无解。
此时如果存在一个叶子到树中心的路径上均为二度点,那么它有可能是答案,需要check(如果有多个这样的叶子那么随意挑一个就行)。如果失败,那么一定无解(因为树中心是非法的)。
此时如果叶子按深度被分为两类,那么如果存在一类中只有一个叶子,那么拿它check。
只有以上三种情况。为了防止树中心在边上,可以在每个边上加一个虚点。
F
题意:求在区间 \([a,b]\) 中找一个最小的 x 使得 \(\textabs(\textsin(\fracpq \pi x))\) 最大。 \(0 \le a \le b \le 10^9, 1 \le p,q \le 10^9\)
key:姿势
实际上是求一个最小的 x 使得 \(f(x)=2px \bmod 2q\) 最靠近 q。
性质:\(f(x)+f(y)\equiv f(x+y) \bmod 2q\) 。所以对于区间内每个数 x ,都可以把它拆分为 \(x=a+i*t+j\) 。其中 \(t=\sqrtb-a+1, j=(x-a) \bmod t, i \in [0,t]\)
所以只需要把所有 \(f(a+j)\) 记下来排个序,之后枚举 i 二分查找即可。剩余的区间( \(i=t\) 时 j 可能取不到所有\([0,t)\) )需要暴力。
有两个坑点:1. 有序表中同样 f 的取小的。 2. 因为模运算的序列是环形的,所以如果二分查找的结果是首/尾,需要特判。
以上是关于Codeforces Round #566 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #566 (Div. 2)
Codeforces Round #566 (Div. 2)题解
Codeforces Round #566 (Div. 2)
Codeforces Round #566 (Div. 2)C(字符串,SET)
Product Oriented Recurrence(Codeforces Round #566 (Div. 2)E+矩阵快速幂+欧拉降幂)