大概就是對於所有的1、2號操作先不做考慮,先考慮3號
對於所有的3操作將該點與所有的需進行的操作連一條有向邊
然後以操作從後往前拓撲
因為運算元眾多,我們考慮將所有的貢獻統一處理
設乙個mul表示該操作對全域性積的影響
則1號操作的mul為1,2號操作的mul為該點操作的值,而3號操作應該是所有的子節點的mul的積
現在我們的問題主要是要求所有的1號操作對答案的貢獻
有個問題就是在倒序操作下,對該加法操作有影響的應該是它前面的那些乘法操作
所以我們用乙個sum來表示該點前面的總全域性積
先倒序操作將所有操作的sum給求出來(僅處理讀入操作的sum)
因為兒子的拓撲序肯定在父親的後面
所以我們按照拓撲序下傳sum
對於加法操作,我們先把該子樹前面的全域性積給算出來,對於該點的加法貢獻就很好計算了
#include
#include
#define m 100001
#define qu 1000001
#define mo 998244353
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using
namespace std;
int len,tmp,cnt,pro,x,q,i,j,n,m,q[m]
,go[qu]
,to[qu]
,last[m]
,po[m]
,p[m]
,ord[m]
;long
long a[m]
;struct node
b[m]
;void
make
(int x,
int y)
void
topu()
}}intmain()
else
if(b[i]
.ccf==2)
else}}
topu()
;for
(i=m;i>=
1;i--
)for
(j=last[ord[i]
];j;j=to[j]
) b[ord[i]
].mul=b[ord[i]
].mul*b[go[j]
].mul%mo;
scanf
("%d"
,&q)
;for
(i=1
;i<=q;i++
)scanf
("%d"
,&q[i]);
cnt=1;
for(i=q;i>=
1;i--
)for
(i=1
;i<=n;i++
) a[i]
=a[i]
*cnt%mo;
for(i=
1;i<=m;i++)if
(b[ord[i]
].ccf==1)
}for
(i=1
;i<=n;i++
)printf
("%d "
,a[i]);
return0;
}
CSP2020 函式呼叫
點此看題 從部分分的做法入手,當只有加法操作的時候利用拓撲序下傳標記的方法是明顯的。但是多了乙個乘法,此時不要考慮成 一起乘 這樣攪在一起想是很難受的。其實 a aa 陣列是個空殼子,因為拿到所有2 22操作的乘積是很容易的 直接拓撲 所以我們只用考慮乘法對加法的貢獻。首先我們從大的操作順序上去考慮...
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倍 發現對於乘法操作,在最後給所有陣列元素乘上就好了,而乙個加法操作帶的係數就等於它後面...
CSP 2020初賽遊記
第2次參加csp 每天筆試 機試 在家放鬆 寫作業 雞鴨月考 愉快的在別人月考的時候離開雞鴨 坐車,車位置不夠,教練cdc cdccd c向我發出同車邀請,被拒絕 最後做了大巴的司乘專座 快樂 到了紀中門口,還要等cdc cdccd c的小車車到才能下車 明明比三鑫早到結果不能下車,啊這 結果c d...