CSP S 2020 C 函式呼叫

2022-05-08 04:27:12 字數 1148 閱讀 4649

其實並不是一道難題,只是不知道如何一步步算。

首先想算出每個 \(1\) 操作的係數,這樣能省去很多重複步驟。

觀察到 \(1\) 操作可以被分成單個函式(指直接出現在函式操作序列中)和被引用函式(被直接出現在函式操作序列中的第 \(3\) 類函式引用)。

對於每個(一種函式可能在函式操作序列中被直接呼叫多次)單個函式我們需要算出在呼叫它之後呼叫的 \(2\) 操作之積,顯然這就是對於這個單個函式的係數。我們將這種函式的每個單個函式的係數相加,顯然就是這種函式的單個函式的總係數。

那被引用函式呢?我們只要向上面那樣,算出第 \(3\) 類函式的係數,再下傳給它就好了(注意這是乙個 \(\text\),所以用拓撲排序來下傳)。

詳見注釋。

#include #define rep(i,_l,_r) for(signed i=(_l),_end=(_r);i<=_end;++i)

#define print(x,y) write(x),putchar(y)

int read()

void write(int x)

#include #include using namespace std;

const int maxn=1e5+5,mod=998244353;

int n,m,q,a[maxn],op[maxn],pos[maxn],val[maxn],id[maxn],deg[maxn],mul[maxn],add[maxn],f[maxn];

vector g[maxn];

queue q;

bool vis[maxn];

void dfs(int u)

} }int main()

} q=read();

rep(i,1,q) id[i]=read();

rep(i,1,m) if(!deg[i]) dfs(i);

y=1;

for(int i=q;i>=1;--i)

topol();

rep(i,1,n) print((1ll*a[i]*y%mod+add[i])%mod,' '); puts("");

return 0;

}

CSP S 2020 T3函式呼叫

這道題的難度大概是這次提高組最難的一題了,考試時一直在想線段樹合併,發現時間過不了以後就放棄打了暴力。關於這道題,可以容易發現,對於乘法操作,直接最後乘上即可,對於加法操作,只需要將加的數乘上後面乘的數就行了。所以可以得出乙個做法 首先可以考慮反著做一次拓撲排序,求出每次操作中包含了多少次乘法操作。...

CSP S2020 函式呼叫(洛谷民間資料)

傳送門 其實除了第一題,剩下幾道出的都挺不錯的,至於賽制的改變我也不知道會帶來了什麼影響,畢竟我已經不是oi選手了 似乎又搞起了acm 廢話不多說。這道題思維難度真的挺大的,想了半天也沒想出正解,題解也是看了好長一段時間才懂,感覺自己原來沒這麼菜啊 所以這裡先隆重推出一篇題解 ak dream的 c...

CSP2020 函式呼叫

點此看題 從部分分的做法入手,當只有加法操作的時候利用拓撲序下傳標記的方法是明顯的。但是多了乙個乘法,此時不要考慮成 一起乘 這樣攪在一起想是很難受的。其實 a aa 陣列是個空殼子,因為拿到所有2 22操作的乘積是很容易的 直接拓撲 所以我們只用考慮乘法對加法的貢獻。首先我們從大的操作順序上去考慮...