這道題的難度大概是這次提高組最難的一題了,考試時一直在想線段樹合併,發現時間過不了以後就放棄打了暴力。
關於這道題,可以容易發現,對於乘法操作,直接最後乘上即可,對於加法操作,只需要將加的數乘上後面乘的數就行了。
所以可以得出乙個做法:
首先可以考慮反著做一次拓撲排序,求出每次操作中包含了多少次乘法操作。
然後從後往前掃一遍所有詢問的操作,將乘法操作統計一下。
對於加法操作,發現乘上多少意味著重複了多少次這個操作,然後可以記錄一下每個操作後面要經過多少次操作,然後再來乙個拓撲排序,處理和乙個加法操作同級的操作中後面要進行的乘法操作。
然後這道題就做完了。
#include#include#include#define n 200000
#define m 2000000
#define ll long long
#define mo 998244353
using namespace std;
ll n,a[n],m,opt,q,q[n],qp[n],num,p[n],sum;
ll i,j,k,data[n],x,y,val,tot;
struct edgee[m],ep[m];
struct nodef[n];
void insert(ll x,ll y)
void insertp(ll x,ll y)
int main()
} }j=0;
for (i=1;i<=m;i++)
if (!f[i].out)
i=0;
while (i=1;i--)
for (i=1;i<=n;i++) a[i]=a[i]*val%mo;
j=0;
for (i=1;i<=m;i++)
if (!f[i].in)
i=0;
while (i
} }for (i=1;i<=m;i++)
if (f[i].add[1]) a[f[i].add[1]]=(a[f[i].add[1]]+f[i].times*f[i].add[2]%mo)%mo;
for (i=1;i<=n;i++) printf("%lld ",a[i]);
printf("\n");
return 0;
}
CSP S 2020 C 函式呼叫
其實並不是一道難題,只是不知道如何一步步算。首先想算出每個 1 操作的係數,這樣能省去很多重複步驟。觀察到 1 操作可以被分成單個函式 指直接出現在函式操作序列中 和被引用函式 被直接出現在函式操作序列中的第 3 類函式引用 對於每個 一種函式可能在函式操作序列中被直接呼叫多次 單個函式我們需要算出...
CSP S2020 函式呼叫(洛谷民間資料)
傳送門 其實除了第一題,剩下幾道出的都挺不錯的,至於賽制的改變我也不知道會帶來了什麼影響,畢竟我已經不是oi選手了 似乎又搞起了acm 廢話不多說。這道題思維難度真的挺大的,想了半天也沒想出正解,題解也是看了好長一段時間才懂,感覺自己原來沒這麼菜啊 所以這裡先隆重推出一篇題解 ak dream的 c...
Csp S 2020 T4 貪吃蛇 題解
這道題我調了好久 細節非常多。首先,看完題目後,可以發現這是一道博弈問題。那麼接下來,我們假設最強蛇為 x xx 最弱蛇為 y yy 那麼這裡就有兩個結論 如果 x xx 吃了 y yy 不是最弱的蛇,則 x xx 必吃 y yy 證明 假設當前第二強的蛇為 a aa 第二弱的蛇為 b bb 那麼 ...