牛客 排列計數機(線段樹 二項式定理)

2022-03-17 03:44:25 字數 2176 閱讀 7301

定義乙個長為k的序列a1,a2,…,ak的權值為:對於所有1≤i≤k,max⁡(a1,a2,…,ai)有多少種不同的取值。

給出乙個1到n的排列b1,b2,…,bn,求b的所有非空子序列的權值的m次方之和。

答案對109+7取模。

第一行兩個整數n、m。

接下來一行n個整數,第i個整數為bi。

輸出乙個整數,表示答案。

示例1輸入

3 21 3 2

輸出16

說明在所有非空子序列中:

(1), (3), (2), (3, 2)權值為1,

(1, 3), (1, 2), (1, 3, 2)權值為2。

那麼所有非空子序列權值的2次方和為4×12+3×22=16。

備註:對於前10%的資料,n≤20。

對於前20%的資料,n≤100。

對於前40%的資料,n≤1000。

對於另外20%的資料,m=1。

對於所有資料,1≤n≤105,1≤m≤20,保證b是1到n的排列。

分析直接求看樣子是不可能的,出題人這輩子都不可能讓你直接求的

所以考慮從左到右乙個乙個加入數。

當加入乙個數的時候,只有最大值小於這個數的子串行,權值才會被更新(即加1)

我們不可能把每個子串行的權值都求出來後才乘方再加起來,鐵定會t

但我們根據二項式定理,可以發現對於任意乙個數x

$$(x+1)^m=c_^x^+c_^x^+c_^x^+\cdots\cdots+c_^x^+c_^x^+c_^x^$$

通過這個

我們可以通過維護每個子串行權值的m次方和,m-1次方和,m-2次方和。。。。。。1次方和,0次方和,就可以通過上面的公式得到這些子串行權值集體加1後的乘方的和

由於每次插入值的時候更新只跟最大值有關,而且題目中保證了b是乙個排列。

所以,我們可以把最大值相同的子串行一起處理,維護它們的m次方和,m-1次方和,m-2次方和。。。。。。

加入乙個新的數的時候,找到所有最大值比它小的子串行,將它們的m次方和,m-1次方和。。。。。。加起來,再用二項式定理得到加1後的m次方和,得到一組新的子串行的資訊

對於那些最大值比它的子串行,因為無法更新但可以形成新的子串行,直接將和乘以2就好了

這個可以用線段樹維護,線段樹的每個位置維護相同最大值的子串行的一些資訊

code

#include#include

const

int mod=1e9+7

;const

int maxn=100005

;int n,m,ans,a[maxn],tmp[30],pre[30],c[30][30],sum[maxn<<2][30],mk[maxn<<2][30

];void pushdown(int id,int l,int r,int

k)void add(int id,int l,int r,int x,int v,int

k)

int mid=(l+r)>>1

;pushdown(id,l,r,k);

x<=mid?add(id<<1,l,mid,x,v,k):add(id<<1|1,mid+1

,r,x,v,k);

sum[id][k]=(sum[id<<1][k]+sum[id<<1|1][k])%mod;

}int que(int id,int l,int r,int x,int

k)void mul(int id,int l,int r,int x,int

k)

int mid=(l+r)>>1

;pushdown(id,l,r,k);

x<=mid?mul(id<<1,l,mid,x,k),1:0

; mul(id

<<1|1,mid+1

,r,x,k);

sum[id][k]=(sum[id<<1][k]+sum[id<<1|1][k])%mod;

}int

main()

scanf(

"%d%d

",&n,&m);for(int i=0;i<=n<<2;i++)for(int k=0;k<=m;k++)mk[i][k]=1

;

for(int i=1;i<=n;i++)

printf("%d

",(que(1,1,n,n,m)%mod+mod)%mod);

}

牛客 傷害計算 排列計算

給你乙個由 號分割的字串,每一段可能是純整數,那麼直接相加即可,也可能是由乙個整數a加 d 加乙個整數b組成,表示投擲a次有b面的篩子,結果加上它的期望 直接記錄每個 號位置,然後將字串分割出來,按題意模擬即可,期望公式就是 b 1 b 2a b includeusing namespace std...

線段樹 貪心 F 排列計算

天才程式設計師菜哭武和石頭組隊參加乙個叫做國際排列計算競賽 international competition of permutation calculation,icpc 的比賽,這個比賽的規則是這樣的 乙個選手給出乙個長度為 n 的排列,另乙個選手給出 m 個詢問,每次詢問是乙個形如 l,r ...

sequence 牛客 ( 線段樹)

題面 your are given two sequences a1 n,b1 n a b a1 n b1 n you need to answer max 1 l r n displaystyle max times sum b 1 l r nmax 1e 6 b i 1e 6 1e6 1 e6 ...