函數是各類編程語言中一項重要的概念,藉助函數,咱們總能夠將複雜的任務分解成一個個相對簡單的子任務,直到細化爲十分簡單的基礎操做,從而使代碼的組織更加嚴密、更加有條理。然而,過多的函數調用也會致使額外的開銷,影響程序的運行效率。html
某數據庫應用程序提供了若干函數用以維護數據。已知這些函數的功能可分爲三類:算法
在使用該數據庫應用時,用戶可一次性輸入要調用的函數序列(一個函數可能被調用屢次),在依次執行完序列中的函數後,系統中的數據被加以更新。某一天,小 A 在應用該數據庫程序處理數據時遇到了困難:因爲頻繁而低效的函數調用,系統在執行操做時進入了無響應的狀態,他只好強制結束了數據庫程序。爲了計算出正確數據,小 A 查閱了軟件的文檔,瞭解到每一個函數的具體功能信息,如今他想請你根據這些信息幫他計算出更新後的數據應該是多少。數據庫
第一行一個正整數 n,表示數據的個數。
第二行 n個整數,第 i個整數表示下標爲 i的數據的初始值爲 ai。
第三行一個正整數 m,表示數據庫應用程序提供的函數個數。函數從 1∼m編號。
接下來 m行中,第 j(1≤j≤m)行的第一個整數爲 Tj,表示 j號函數的類型:編程
第 m+4 行一個正整數 Q,表示輸入的函數操做序列長度。
第 m+5行 QQ 個整數 fi,第 i個整數表示第 i個執行的函數的編號。編程語言
一行 n個用空格隔開的整數,按照下標 1∼n的順序,分別輸出在執行完輸入的函數序列後,數據庫中每個元素的值。答案對 998244353 取模。函數
題解:spa
這個題,研究以後發現真的是好題;htm
首先題目中的調用關係提示咱們應該是個有向圖,同時,函數不會直接或者間接的調用本身,因此不會出現環的狀況blog
有向圖上的算法有哪些呢?拓撲排序,最後的q次調用函數,也能夠寫成等同於m次操做,只是他爲0號,會調用q次函數,因此以0號爲超級原點,創建有向圖便可排序
題目中提示了,若是隻有操做1或者只有操做2怎麼辦?
若是隻有乘法操做,哎呀,爽歪歪,直接拓撲排序,記錄最終0號節點被乘了多少次x就好了,最終序列中全部的值直接乘以x便可
若是隻有加法操做呢?暫時不會
加法操做和乘法操做混在一塊兒的時候,就比較難計算,由於加法操做會被乘法操做影響,可是,咱們考慮,加法操做會被哪些乘法影響呢?他只會被本身後面進行的乘法影響,因此對於每個加,咱們是否能夠計算出這個加法操做被乘法執行了多少次,執行了多少次就是加法的倍數,最後咱們用被加數*倍數就能夠獲得加的值是多少?