CSP2020 函式呼叫

2021-10-10 16:02:22 字數 2001 閱讀 5511

點此看題

從部分分的做法入手,當只有加法操作的時候利用拓撲序下傳標記的方法是明顯的。

但是多了乙個乘法,此時不要考慮成"一起乘",這樣攪在一起想是很難受的。其實 a

aa 陣列是個空殼子,因為拿到所有2

22操作的乘積是很容易的(直接拓撲),所以我們只用考慮乘法對加法的貢獻

首先我們從大的操作順序上去考慮,對於乙個 g[i

]g[i]

g[i]

操作,先求出後面 g[i

+1...n]

g[i+1...n]

g[i+1.

..n]

操作引起的的2

22操作總乘積 mul

mulmu

l,那麼 g[i

]g[i]

g[i]

操作引發的1

11操作次數都要乘上 mul

mulmu

l ,這時我們再考慮某個操作內部乘法對加法的影響。

類似於只有加法的情況,我們考慮用標記下傳的方式來實現他,如圖:

就用圖示方法下傳標記,其中 1,2

,31,2,3

1,2,

3 表示題目中的訪問順序,m1,

m2m1,m2

m1,m

2 表示2

22操作的乘積,拿到拓撲序就很好做了。

#include

#include

#include

using

namespace std;

const

int m =

100005

;const

int mod =

998244353

;int

read()

while

(c>=

'0'&& c<=

'9')

return x*f;

}int n,m,k,q,tot,tmp,f[m]

,w[m]

,p[m]

,d[m]

,c[m]

;queue<

int> q;

int b[m]

,tag[m]

,deg[m]

,a[m]

;struct edge

e[10

*m];

void

tpsort()

}}signed

main()

,f[i]

=tot;

deg[j]++;

}}}tpsort()

;for

(int j=m;j>=

1;j--)}

q=read()

;tmp=1;

for(

int i=

1;i<=q;i++

) b[i]

=read()

;for

(int i=q;i>=

1;i--

)for

(int j=

1;j<=m;j++)}

for(

int i=

1;i<=n;i++

) w[i]

=1ll

*w[i]

*tmp%mod;

for(

int i=

1;i<=m;i++)if

(p[i]

) w[p[i]]=

(w[p[i]]+

1ll*tag[i]

*d[i]

)%mod;

for(

int i=

1;i<=n;i++

)printf

("%d "

,w[i]);

puts("");}

CSP2020 函式呼叫

1.考慮只有型別1,2的操作的情況 假設乙個陣列依次執行 a 1 1,3,a 1 2,a 3 2,2 那麼 a 1 a 1 3 2 1 3 2 2 2 a 3 a 3 3 2 2 2 陣列其餘元素均乘上3 2 6倍 發現對於乘法操作,在最後給所有陣列元素乘上就好了,而乙個加法操作帶的係數就等於它後面...

CSP2020 函式呼叫(call)

大概就是對於所有的1 2號操作先不做考慮,先考慮3號 對於所有的3操作將該點與所有的需進行的操作連一條有向邊 然後以操作從後往前拓撲 因為運算元眾多,我們考慮將所有的貢獻統一處理 設乙個mul表示該操作對全域性積的影響 則1號操作的mul為1,2號操作的mul為該點操作的值,而3號操作應該是所有的子...

CSP 2020初賽遊記

第2次參加csp 每天筆試 機試 在家放鬆 寫作業 雞鴨月考 愉快的在別人月考的時候離開雞鴨 坐車,車位置不夠,教練cdc cdccd c向我發出同車邀請,被拒絕 最後做了大巴的司乘專座 快樂 到了紀中門口,還要等cdc cdccd c的小車車到才能下車 明明比三鑫早到結果不能下車,啊這 結果c d...