函式呼叫
暴力**和爆零經歷看這裡
考完發現其實不難(確信
首先分析題目性質,發現如果只有乘法的情況將十分好做,只需要用乙個變數記錄乘積。
那麼對於加減混合的題目來說,在操作中加上乙個數等價於最終加上這個數乘之後被乘的次數。
即 \(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 其操作物件為檔案控制代碼...