5921. 【NOIP2018模擬10.22】種花
題目大意
因為找不到題面所以就勉為騎♂男C了一張下來
思路
因為題目要求的是最後的總和,所以可以分開每一對a[i]和a[j]來考慮,計算每一對的貢獻
對於每一對數,考慮其位置和出現次數,可以分成幾類出現次數相同的來討論
那麼每一類的貢獻就是
(距離1+距離2+……)*出現次數*(a[i]-a[j])=距離之和*每一對的出現次數*(a[i]-a[j])
a[i]-a[j]可以放到最後再乘
分類討論
設b[p[i]]表示p[i]在原序列的位置i,列舉a[i]和a[j]的具體數值,然後考慮ij在原序列上的位置(i<j 且 a[i]>a[j]且a[i]!=p[i]且a[j]!=p[j])
(下文為了方便直接用i表示a[i],j表示a[j],也就是i>j且i的位置在j前,同時上面的條件變成了i的位置!=b[i] 且 j的位置!=b[j])
先設f[n]表示當有n個數時的錯排數(就是著名的錯排公式 )
其中f[0]=1,f[1]=0
解釋一下
對於每個新加入的數n,首先不能將其放在自己的位置上
所以就要和前面(n-1)個數中的一個交換
對於交換出來的數,如果直接將其放在n,那其它的數就不收影響,就是f[n-2]
如果不放在n,也就相當於這個數原來在n時的錯排(因為錯排就是每個數不能放在自己的位置,其它數不放在自己的位置上,交換的數也不放在n上,就相當於該數原本就在n上,但由於錯排不能放在上面),也就是f[n-1]
所以
由於沒有所以為1
由於不存在所以為0
i和j一定有至少一個在b[i]或b[j]上
b[i]<b[j]
那麼就只可能j在b[i]上,i在b[j]上
j在b[i]上
那麼j固定了,i可以在1~b[i]-1的任意一個位置(因為i的位置<j的位置,所以i不可能到b[i])
然後出現次數類似於錯排公式,i可以在1~b[i]-1的任意一個位置上,將該位置上的數可以放到b[j]或不放b[j]
放的話就直接是f[n-3],不放的話就是f[n-2](等於原來在b[j]上但現在不能放在原位,就是n-2的錯排)
所以該種情況的貢獻為
(不用乘以b[i]-1是因為錯排公式中每種情況的權值為1,所以要乘上去,但現在每種情況的權值為其長度,已在之前計算過。實際就是求每一對(ij都已固定)的出現次數)
i在b[j]上
那麼j可以在b[j]+1~n的任意位置,大致同上
所以該種情況的貢獻為
b[j]<b[i]
i在b[j]上,j在b[i]上
顯然,其它n-2個數與ij沒有關係
所以貢獻就是
j在b[i]上,且i不在b[j]上
因為i不在b[j]上,所以長度總和=1~b[i]-1的和-(b[i]-b[j])(就是除掉i在b[j]上的情況)
然後次數和之前類似,也是f[n-3]+f[n-2]
所以貢獻為
i在b[j]上,且j不在b[i]上
同上。
i和j都不在b[i]和b[j]上
求總和
考慮用容斥求總和。
首先可以O(n)算出總的長度和,再減去所有不合法的情況
不合法的情況是ij中有至少一個在b[i]或b[j]上的4種情況
然後發現b[i]~b[j]這一段被減了兩次,要再加回去
設l為min(b[i],b[j]),r為max(b[i],b[j]),則總和就是
然後實際和lr的順序每多大關係,可以再優化(見最終程式碼)
那麼對於每一對ij,考慮換出來的兩個數的位置
有兩個數在b[i]b[j]上
那麼顯然,就是f[n-4]
但因為換出來的數可以交換,所以實際上是
有一個數在b[i]b[j]上
也很顯然,就是f[n-3](另一個數不在另一個位置上)
但實際上有4(兩個數*兩個位置)種情況,貢獻為
一個數都不在b[i]b[j]上
由於這個問題過於哲♂學所以先不討論
another problem
考慮另一個問題:
求在長度為n的錯排下,且有兩個數不能放入另外兩個位置中的任意一個
還是考慮容斥,設這兩個數為i和j且ij都在其原來的位置上,則不合法的情況有
(X表示另一個數不在該位置)
由於是錯排,首先加上f[n]
那麼所有i和j在原位的情況都被考慮了
然後減去f[n-1]*2,也就是ij有一個在上面的情況
最後減去f[n-2],也就是兩個都在上面的情況
所以最終的答案為
原來的問題
因為原來的i和j都已被固定,所以就相當於上面長度為(n-2)時的問題
所以貢獻為
真是奇♂妙
所以這一種情況的貢獻為