CSP2020 函式呼叫(call)

2021-10-10 12:14:36 字數 1656 閱讀 2663

大概就是對於所有的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...