arc187
A:
两个数交换位置,然后后面那个数+k
考虑枚举最后的顺序,那么这时候的数列。构造一下吧。因为我们发现可以不断横跳,这样就给两个相邻的数都+k,这很好,但是我们最多也只能做到这个了,或者我们随机交换,但是没这个脑子。额,正解就是随机,因为这个限制非常松。我们会想到冒泡排序。我们直接如果a[i]>a[i+1],那么我们对a[i+1]和a[i+2]都+k,那如果a[n-1]>a[n]怎么办呢。考虑只操作最后三个数,其中a[n-2]<a[n-1]>a[n]。我们后面先尽量操作更多次数,那么我们就保证了a[n-2]永远是最小的,然后交换a[n-2]和a[n-1],然后a[n-2]和a[n-1]直接搞即可,然后就做完了。还是要点水平的。
B:
考虑做到每个点的时候会不会有对联通块的贡献,貌似不太行,考虑每个联通块的特征。我们把序列拆成许多单调递减的序列,这内部是不会有连边。同时,设前面的最小值为x,这里面>=x会向前面连边<=x的会向后面连边,但这样既有前面又有后面很难算所以我们尽量只考虑一边。我们发现两个连通块的值域必然是一个在上,一个在下。我们每加进去一个点我们都会将前面的一些联通块给并到一起,然后就清晰一点了。唉,不会啊,看了眼题解,怎么是组合数学计数题,破防了,这tm从来做不出的吗,唉,多练。容易发现联通块之间编号连续,然后我们就可以列出dp方程,dp[i]=\sum dp[j]*()方案数,这应该是简单的,但是会不会有重复算,我们的方案数是左边的都大于中间的,右边的都小于中间的。然后考虑每个点的贡献,就是每个点会在多少情况产生贡献,这个简单,我们处理出左边最小值>=j的方案数乘上右边最大值等于=j-1的方案数,这样是不重不漏的。

浙公网安备 33010602011771号