思路讲解
其实不难,挺简单的。
我的思路是由于限制了半径的大小的总和,所以说可以把每个圆的每个x都扫一遍,扫到这个x了这个圆在这个x上包含了几个点就很容易知道了。然后把x上有多少个点被包含存在Cnt里就好了,最后扫一遍加起来就好。
1 | FOR(i,1,N){ |
AC代码
https://codeforces.com/contest/2074/submission/318915158
1 | // Problem: D. Counting Points |
其实不难,挺简单的。
我的思路是由于限制了半径的大小的总和,所以说可以把每个圆的每个x都扫一遍,扫到这个x了这个圆在这个x上包含了几个点就很容易知道了。然后把x上有多少个点被包含存在Cnt里就好了,最后扫一遍加起来就好。
1 | FOR(i,1,N){ |
https://codeforces.com/contest/2074/submission/318915158
1 | // Problem: D. Counting Points |
K其实就是吃掉一个寿司所需要花费的时间。
你可以不停拿,但是最后要吃完,拿的时候不能吃。
这个其实是个贪心,这个把题目完全读完就可以得出。
https://www.luogu.com.cn/article/flnzpg4m 这个题解写的很清楚。
总的来说,其实就是这么选一定是合法的,但不一定最优。

而且可以证明所有的O是不能再往后移了,只能往前移。当然,往前移一定是合法的。
具体而言是这样的。
1 | ll idx=0; |
https://codeforces.com/contest/2085/submission/319924135
1 | // Problem: D. Serval and Kaitenzushi Buffet |
$(x+k) + (y+k) = (x+k)\oplus (y+k) $ 等价于 $ (x+k)&(y+k)=0,其实就是不允许x+k$和 y+k 这位都是 1 的情况。

然后呢,这种题虽然主要的思想是按位分析,但是还是需要构造的,而且不要试图构造一些不特殊的,而是构造一些特殊的(如上所示)。
https://codeforces.com/contest/2085/submission/318796295
1 | // Problem: C. Serval and The Formula |
之前陷入了错误思路中,认为是要按位分析,然后通过给每位+1避免出现11现象,其实这是很难的,因为进位会互相影响。
题意就是所有点只能经过一次(选择一次),构造出字典序最大的 (dis,u,v) 序列,输出这个序列。
注意到,距离是放在第一位的,所以我们肯定优先选择距离最大的。那在树上路径距离最大的是什么?树的直径呗。不过这个树的直径的取法需要优先选择大的起始点和终止点。
然后删除直径后,这张图就不联通了,只要在每个子图中我们遵循这种删除规律即可,最后形成的 ans 数组根据字典序规则排序即可。
以下是样例五的图示展示,第一层删完后,变为了两个子图,这两个子图仍然按照规则选择直径,删除直径上的点,整张图被删完后程序结束。

枚举总量为 n+(n−l1)+(n−l1−l2)+⋯+(n−lc−⋯−li−⋯l1),即 n×c−l1×c−l2×(c−1)−⋯−lc,也就是,其中 n 为点的数量,li 为第 i 层的直径总数,c 为总层数。枚举总量在逐层下降是因为每层选择的直径上的点会被删除。
n 是给定的,那么我们假设 c 最大,那么 c 最大的情况是什么呢?
c 最大的情况,就是我们每层只能删除一条直径,也就是说该图在删除直径的过程中一直保持着联通状态。把层数卡满的图可以这样构造,注意到,分枝直径的点的数量≤⌊直径的点的数量/2⌋,如果大于这个限制,该分枝就要被删除了。

那么近似的,我们可以得到。
x+2x+22x+⋯+2cx=n
由于⌊2cx⌋必须大于 0,我们知道 2c≤x<2c+1。
那么不妨令 x=2c+1。
2c+1+2c+⋯+2=n
运用等比数列求和公式。
2×(2c+1−1)=n
因此,c≈log(n)。
故该算法的总体时间复杂度为O(nlogn)。
https://codeforces.com/contest/2107/submission/318737306
1 | // Problem: D. Apple Tree Traversing |
唉,dp,你说没想到吧,也想到了一点,但没往下深想。
唉,主要想错了,这个行和列是相互独立的。
其实就是出现两者之间相差一的情况,那么这个比较小的列就无法加一了。

但其实上面这个说法不全面,导致我的算法设计有瑕疵,比如说下面这个例子
1 | 1 |
不难发现,上面这个例子还有可能传递,如第 n 列需要 +1 但是和第 n−1 列相同了,所以第 n−1 列也需要 +1 ,但 n−1 列和第 n−2 列相同了……。
当然,上面说了这么多,其实意思只有一个,就是不能以需要操作的行和列为主体,而应该以所有列为主体,因为操作行和列的操作可能导致其他行和列也需要操作。
不过,我们也发现行和列能怎么操作也只和相邻的行和列相关,那么如果按顺序转移也是可以的。
状态定义如下所列。
1 | // dpC[i][0] 表示保留第i列所需的最小花费 |
转移只要确定是否合法其实就很简单了。
https://codeforces.com/contest/2096/submission/318683142
1 | // Problem: C. Wonderful City |