这题真是太牛啦。
考虑定义一个局面的势能函数 \(F(s)\),满足对于 \(F(s)+1=\frac{\sum_{T}f(t)}{num_t}\),就是能转移到的状态的期望势能是 \(F(s)+1\),这样答案期望就是 \(F(end)-F(start)\)。
设 \(F(s) = \sum_{i}{f(a_i)}\),然后分析一下每次操作势能函数的变化。
因为是随机选择两个点操作,不妨假设是跟随节点个数是 \(a,b\),有:
定义 \(f(0)=0\),均分一下得到 \(f(a)+\frac{1}{2}=\frac{1}{2}f(a+1)\),考虑变成一个等比数列的形式 \(f(a)+k=\frac{1}{2}\left ( f(a+1)+k \right )\),解得 \(k=1\)
所以构造出函数 \(f(a)=2^a-1\)
计算一下就好了。
这个比较简单,套路的对于第 \(i\) 个和第 \(i+k\) 个数可以直接得到他们的关系,建出图。
发现只要确定了第一组,后面每个都会被确定,计算出第一组有几个没有确定,组合数计算。
可以发现对于连续的 \(3\) 个 \(1\),只需要在那中间放一个 \(1\) 就可以满足条件。
正着 \(dp\) 可以通过 \(easy\text{ }version\),倒着 \(dp\) 即可。
先考虑如果我们已经确定了最大、最小值分别由 \(a_i,a_j\) 产生,产生的最大权值是多少。
按位考虑,发现对于一位如果 \(a_{i,k} =0,a_{j,k} = 1\),我们让 \(x\) 这一位取 \(1\) 就不会有负贡献,所以产生的最大权值就是 \(a_i\) 中是 \(1\) 且 \(a_j\) 中是 \(0\) 的那些位的加权和,可以写成 \(a_i \And (\neg a_j)\),定义 \(b_i=\neg a_i\)。
然后我们可以建一棵反向的树,每个集合代表的点,可以到达自己的子集的点,每次新加点的时候,在树上标记这个点能不能取到,可以记忆化,查询时按位考虑能取就取。
首先有暴力的区间 \(dp\) 计算 \(sg\) 值。
然后发现每次操作 \(c\) 后剩下的区间要不开头是 \(c\),要不结尾是 \(c\),这样有用区间就降到了 \(O(n|\sum|)\) 个。
然后发现每次操作后,只有开头和结尾段只有一边是 \(c\),别的都是两边都是 \(c\),所以考虑把每个两边是 \(c\) 区间的 \(sg\) 值预处理出来,多出来的一些前缀和后缀可以记忆化计算。