CSP S T3 函式呼叫

2022-06-03 18:48:10 字數 2007 閱讀 3218

事先宣告,考試時由於本人太菜,t1寫了兩個小時還tm沒判12.31掛了所以只是口胡了個拓撲排序,直接打了40分,考完自閉了很久之後才碼出來

首先我們發現由於不會遞迴,所以把所有操作連起來會形成一張dag,dag上並沒有什麼很好的資料結構可以維護,所以可以考慮分別考慮乘法和加法的影響,可以發現,最終值是初始值乘以一堆值再加上一堆值

又因為乘法顯然會對加法產生影響所以可以考慮,每個加法到最後都會加幾次

可以發現每個加法最後加幾次,等價於在這個加法之後,全域性乘的數值的積,於是我們可以考慮倒著處理這個函式數列

每次加法的時候就加上標記,(前面乘的積),乘法就更新全域性積,如果是遞迴,就先給它下轄(即最終會被呼叫的乘法或者加法)的所有加法加上標記(打在它本身上面,最終拓撲排序下傳),然後再用下面的乘法更新全域性積

最後打完標記最後拓撲排序下傳一下就行.具體地依然從後往前處理,注意要更新一下最終加法的次數(類似於線段樹合併,處理右兒子時要考慮左兒子的貢獻),具體看**吧

其實也不是很難,還是我太菜了

/*

call

*/#include

using

namespace

std;

intread()

const

int maxn = 1e6 + 10

;struct

edgeedge[maxn

<<1

];int

a[maxn];

inthead[maxn],tot;

intdeg[maxn];

void add_edge(int x,int

y)struct

funcf[maxn];

intseq[maxn];

int c = 1

;int

tag[maxn];

#define mod 998244353

intmul[maxn];

void add(int &x,int

y)void sol(int

x)

else

if(f[x].op == 2

)

else

}}void dfs(int

x)

for(int i = head[x]; i ; i = edge[i].nxt) dfs(edge[i].point),mul[x] = 1ll * mul[x] * mul[edge[i].point] %mod;

}int

q[maxn];

intmain()

else

if(op == 2

)

else}}

memset(mul,-1,sizeof

(mul));

int t =read();

for(int i = 1; i <= t; ++i) seq[i] =read();

for(int i = 1; i <= m; ++i) dfs(i);

for(int x = t; x; --x)

}for(int i = 1; i <= n; ++i) a[i] = 1ll * a[i] * c %mod;

int l = 1,r = 0

;

for(int i = 1; i <= m; ++i) if(!deg[i]) q[++r] =i;

while(l <=r)

if(f[x].op == 2) continue

;

int v = 1

;

for(int i = head[x]; i ; i =edge[i].nxt)

}for(int i = 1; i <= n; ++i) printf("

%d%c

",a[i],"

\n"[i ==n]);

return0;

}

python3呼叫函式函式 呼叫函式

python內建了很多有用的函式,我們可以直接呼叫。也可以在互動式命令列通過help abs 檢視abs函式的幫助資訊。呼叫abs函式 abs 100 abs 20 abs 12.34 12.34 呼叫函式的時候,如果傳入的引數數量不對,會報typeerror的錯誤,並且python會明確地告訴你 ...

C C 函式呼叫機制 3

c 函式呼叫機制 c 函式呼叫機制 主要通過堆疊呼叫來實現 棧是一種後進先出的資料結構 就像子彈夾一樣 先放進去的子彈在最底層 後放進去的在上層 在扣動扳機的時候 後面放進去的子彈先飛出去 c 的函式呼叫過程主要是要做好呼叫初始化和善後的處理過程 步驟 1.分配被呼叫函式所需的棧空間 的執行需要相應...

日常Python 3 呼叫函式

任務.輸出每日一貼 在idle中建立乙個名為function tips.py的檔案,然後在該檔案中建立乙個名稱為function tips的函式,在該函式中,從勵志文字列表中獲取一條勵志文字並輸出,最後再呼叫函式function tips 如下 coding gbk def function tip...