AT_arc117_c 题解

题目链接

前言

今天早上模拟赛刚考这题,考场虽然写出来(思路和其他题解好像不太一样),但是不太会证明,若题解有不当之处或者代码可以被举出反例,请及时联系 @guozhetao 改正。

思路

本题解定义 b h ( i , j ) bh(i,j) bh(i,j) 为将第 i i i 个点与第 j j j 个点依据题意变换(如果颜色相同,则为它们的相同颜色;如果颜色不同,则为一个颜色与它们都不同的颜色)。

因为 2 ≤ n ≤ 400000 2 \le n \le 400000 2n400000,因此直接模拟肯定过不了。

观察样例:

W
BR
RWB
RRBB

可以发现最上方的 W 根据题意是由 BR 组合而成,而最低下一行的左右两边分别是 BR

考场上,我尝试其他几种情况,发现当最后一行个数是 4 4 4 时,顶端的字母只和底端左右两个端点有关(且刚好与题目所提供的变化方式相同),于是我猜想:当最后一行个数为 3 k + 1 3^k + 1 3k+1 时,顶端只和底端左右端点有关。

于是,我们每次对于 n n n,找到最大的 k k k 使得 3 k + 1 ≤ n 3^k + 1 \leq n 3k+1n,并枚举第 n − 3 k n - 3 ^ k n3k 层的情况:当 ( i + 3 k ≤ n ) (i + 3 ^ k \leq n) (i+3kn) 时依次更新 b i = b h ( i , i + 3 k ) b_i = bh(i,i + 3^k) bi=bh(i,

你可能感兴趣的:(At,题解,c语言,c++,思维题)