P7077 函式呼叫

2022-04-29 20:24:09 字數 1451 閱讀 5816

函式呼叫

暴力**和爆零經歷看這裡

考完發現其實不難(確信

首先分析題目性質,發現如果只有乘法的情況將十分好做,只需要用乙個變數記錄乘積。

那麼對於加減混合的題目來說,在操作中加上乙個數等價於最終加上這個數乘之後被乘的次數。

即 \(ans_i=a_i\times mul_i+val_i\times f_i\),其中 \(f_i\) 表示位置 \(i\) 在加 \(val_i\) 之後乘上的數量。

顯然我們只有 \(f_i\) 未知,而我們的目標就是求出這個 \(f_i\)。

不難發現這些函式之間的關係構成乙個 dag。

那麼我們將乙個點的 \(f_i\) 分為兩部分:

在這個點呼叫完成之後的操作加上的。

在這個點呼叫過程當中加上的。

對於第一部分,我們只需要倒序迴圈操作序列並且記搜即可。

那麼關鍵是第二部分。

因為這是乙個 dag,所以乙個點不可能被不能到達自己的節點更新,所以考慮拓撲排序統計答案。

假設當前節點為 \(u\),當前遍歷到 \(edge(u,v)\)。

那麼 \(f_v+=f_u+f_\)。其中 \(f_=\sum_ f_k\)

然後直接統計答案即可。

#include#include#include#include#include#define n 100010

#define mod 998244353

using namespace std;

typedef long long ll;

int n,m,q,q[n],a[n],ru[n];

ll f[n],mul[n],add[n];

int val[n],pos[n],typ[n];

bool vis[n];

vectorv[n];

queueqn;

int read()

void dfs(int u)

return;

}int main()

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

if(!ru[i] && !vis[i]) dfs(i);//記搜。

q=read();

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

ll mu=1;

for(int i=q;i>=1;i--)

for(int i=1;i<=m;i++) if(!ru[i]) qn.push(i);

while(!qn.empty())

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

printf("%lld ",(a[i]*mu+add[i])%mod);

return 0;

}

顯然這道題的思維難度不高,但是在考場上想出來還是需要一定的功底的。

例如我就是乙個爆零的蒟蒻。

Luogu P7077 函式呼叫

link 某資料庫應用程式提供了若干函式用以維護資料。已知這些函式的功能可分為三類 1.將資料中的指定元素加上乙個值 2.將資料中的每乙個元素乘以乙個相同值 3.依次執行若干次函式呼叫,保證不會出現遞迴 即不會直接或間接地呼叫本身 在使用該資料庫應用時,使用者可一次性輸入要呼叫的函式序列 乙個函式可...

靜態成員函式呼叫非靜態成員變數 p

c 會區分兩種型別的成員函式 靜態成員函式和非靜態成員函式。這兩者之間的乙個重大區別是,靜態成員函式不接受隱含的this自變數。所以,它就無法訪問自己類的非靜態成員。在某些條件下,比如說在使用諸如pthread 它不支援類 此類的多執行緒庫時,就必須使用靜態的成員函式,因為其位址同c語言函式的位址相...

系統呼叫 函式呼叫

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