Luogu P7077 函式呼叫

2022-05-04 13:27:09 字數 2054 閱讀 2632

\(link\)

某資料庫應用程式提供了若干函式用以維護資料。已知這些函式的功能可分為三類:

\(1.\)將資料中的指定元素加上乙個值;

\(2.\)將資料中的每乙個元素乘以乙個相同值;

\(3.\)依次執行若干次函式呼叫,保證不會出現遞迴(即不會直接或間接地呼叫本身)。

在使用該資料庫應用時,使用者可一次性輸入要呼叫的函式序列(乙個函式可能被呼叫多次),在依次執行完序列中的函式後,系統中的資料被加以更新。為了計算出正確資料,小\(a\)查閱了軟體的文件,了解到每個函式的具體功能資訊,現在他想請你根據這些資訊幫他計算出更新後的資料應該是多少。

可以考慮依次執行完操作序列後,所有數先一起被乘上乙個數,有一些位置再被加上所加上的數乘上這個數的貢獻。

注意到依次執行,不會出現遞迴等關鍵字眼,可以想到拓撲排序。(一定要注意這裡的\(m\)才是原來拓撲排序的\(n\),因為把\(m\)個函式當作點)

可以新建乙個點\(0\),作為主函式,同時將它和輸入的所有呼叫函式連邊。那麼拓撲排序迴圈就要從\(0\sim\)。

前一步是很好做的,可以考慮記憶化搜尋,或者先建反圖,跑一遍拓撲排序。維護乙個乘法標記\(mul\),對於\(1\)類函式和\(3\)類函式,它們的\(mul=1\),對於\(2\)類函式,它的\(mul=v_i\)。然後從下到上,累乘\(mul\)即可。然後所有的\(a_i\)就要乘上\(mul[0]\)。

而如何處理加上的數究竟被加上了多少次呢?我們會發現,當操作序列不斷執行\(\times,+,\times,+...\)時,對於乙個\(+\),只有它後面的\(\times\)會對它產生乘法貢獻。我們在原圖上再跑一邊拓撲排序,從上到下算出每個函式被執行的次數\(add\),也就是加法的次數。

對於\(u\rightarrow\),設\(now=\prod\limits_,t_p>t_v}mul[p]\)(\(t_i\)表示\(i\)被執行的順序先後),那麼\(add[v]=add[v]+add[u]*now\)(\(u\)先執行\(add[u]\)次,每次都使\(add[v]\)乘上\(now\))。算完\(add\)後,處理加法即可。

(這個的確不是很難,但是誰有時間想啊,t1出題人1582.10.5~1582.10.14)

#include using namespace std;

#define ll long long

const ll mod = 998244353;

queue < int > q;

int n, m, t, tot, hd[100005], nxt[1100005], to[1100005], rd[1100005], cnt[1100005];

ll a[100005];

struct node

f[100005];

int read()

while (ch >= '0' && ch <= '9')

return x * fl;

}void add(int x, int y)

void topo1()

} return;

}void topo2()

} return;

}int main()

else if (f[i].tp == 2)

else

}} f[0].add = 1ll;

t = read();

while (t -- )

topo1(); topo2();

for (int i = 1; i <= n; i ++ )

a[i] = a[i] * f[0].mul % mod;

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

if (f[i].tp == 1)

a[f[i].pos] = (a[f[i].pos] + f[i].add * f[i].v % mod) % mod;

for (int i = 1; i <= n; i ++ )

printf("%lld ", a[i]);

puts("");

return 0;

}

P7077 函式呼叫

函式呼叫 暴力 和爆零經歷看這裡 考完發現其實不難 確信 首先分析題目性質,發現如果只有乘法的情況將十分好做,只需要用乙個變數記錄乘積。那麼對於加減混合的題目來說,在操作中加上乙個數等價於最終加上這個數乘之後被乘的次數。即 ans i a i times mul i val i times f i ...

系統呼叫 函式呼叫

linux下對檔案操作有兩種方式 提供了庫函式,如open close read write ioctl 等,需包含標頭檔案unistd.h。以write 函式為例 其函式原型為size t write int fd,const void buf,size t nbytes 其操作物件為檔案控制代碼...

python3呼叫函式函式 呼叫函式

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