點此看題
從部分分的做法入手,當只有加法操作的時候利用拓撲序下傳標記的方法是明顯的。
但是多了乙個乘法,此時不要考慮成"一起乘",這樣攪在一起想是很難受的。其實 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...