事先宣告,考試時由於本人太菜,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...