CSP-S T3函數調用

函數是各類編程語言中一項重要的概念,藉助函數,咱們總能夠將複雜的任務分解成一個個相對簡單的子任務,直到細化爲十分簡單的基礎操做,從而使代碼的組織更加嚴密、更加有條理。然而,過多的函數調用也會致使額外的開銷,影響程序的運行效率。html

某數據庫應用程序提供了若干函數用以維護數據。已知這些函數的功能可分爲三類:算法

  1. 將數據中的指定元素加上一個值;
  2. 將數據中的每個元素乘以一個相同值;
  3. 依次執行若干次函數調用,保證不會出現遞歸(即不會直接或間接地調用自己)。

在使用該數據庫應用時,用戶可一次性輸入要調用的函數序列(一個函數可能被調用屢次),在依次執行完序列中的函數後,系統中的數據被加以更新。某一天,小 A 在應用該數據庫程序處理數據時遇到了困難:因爲頻繁而低效的函數調用,系統在執行操做時進入了無響應的狀態,他只好強制結束了數據庫程序。爲了計算出正確數據,小 A 查閱了軟件的文檔,瞭解到每一個函數的具體功能信息,如今他想請你根據這些信息幫他計算出更新後的數據應該是多少。數據庫

輸入格式

第一行一個正整數 n,表示數據的個數。
第二行 n個整數,第 i個整數表示下標爲 i的數據的初始值爲 ai
第三行一個正整數 m,表示數據庫應用程序提供的函數個數。函數從 1∼m編號。
接下來 m行中,第 j1≤j≤m)行的第一個整數爲 Tj,表示 j號函數的類型:
編程

  1. 若 Tj=1,接下來兩個整數 Pj,Vj分別表示要執行加法的元素的下標及其增長的值;
  2. 若 Tj=2,接下來一個整數 Vj 表示全部元素所乘的值;
  3. 若 Tj=3,接下來一個正整數 Cj表示 j號函數要調用的函數個數,
    隨後 Cj個整數 g1(j),g2(j),…,gCj(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便可

若是隻有加法操做呢?暫時不會

加法操做和乘法操做混在一塊兒的時候,就比較難計算,由於加法操做會被乘法操做影響,可是,咱們考慮,加法操做會被哪些乘法影響呢?他只會被本身後面進行的乘法影響,因此對於每個加,咱們是否能夠計算出這個加法操做被乘法執行了多少次,執行了多少次就是加法的倍數,最後咱們用被加數*倍數就能夠獲得加的值是多少?

相關文章
相關標籤/搜索