2024.9.28 程式碼源模擬賽

whrwlx發表於2024-09-28

省流:\(45+20+5+0=70\)

簡稱:唐詩

在此膜拜 \(klz\) \(Heldivis\) \(Sorato\) \(czl\) \(Ech0\_7\) yxans lihe_qwq 大佬

T1

先看的 T1 ,想了一個拓排(其實是看錯題了),然後過了第一個樣例,然後咋調都過不去,就去碼暴力了。

過了大概 10min 發現看錯題了,然後一會就想出來個 \(O(n^2)\) 的樹形 DP (\(45pts\))然後就潤了。

核心程式碼:

if(x==root) f[x]=g[x];
else
{
    f[x]=f[fa[x]]-(siz[x]>=k)+g[x];
    ans=max(ans,f[x]);
}

然後正解是欽定一個點為 \(LCA\) 然後 DP (其實賽時想到了但是不會轉移,還是 \(\large 菜\)

核心程式碼:

    void dfs(int x,int fat)
    {
        siz[x]=1,g[x]=0,f[x]=-1e18;
        for(auto y:e[x])
        {
            if(y==fat) continue;
            dfs(y,x);siz[x]+=siz[y];
            if(siz[y]>=k) g[x]++;
        }
    }

    void DP(int x,int fat)
    {
        int mx=-1e18;
        for(auto y:e[x])
        {
            if(y==fat) continue;
            DP(y,x);
            f[x]=max(f[x],f[y]+g[x]-(siz[y]>=k));
            ans=max(ans,mx+f[y]+(n-siz[x]>=k)-(siz[y]>=k));
            mx=max(mx,f[y]+g[x]-(siz[y]>=k));
        }
        ans=max(ans,f[x]+(n-siz[x]>=k));
        f[x]=max(f[x],g[x]);
    }

T2

首先寫的暴力(程式碼就不放了)(\(10pts\)

然後 \(L=R=\frac{n\cdot(n+1)}{2}\) 是單調棧板子(\(10pts\)

正解是二分(但是二分函式不是太好想(就很妙))

核心程式碼:

    inline bool check(int x)
    {
        int sum=0;
        fd(i,1,n) fd(j,1,st[i])
            sum+=max(min(x/a[i],j+en[i]-1)-j+1,0ll);
        return sum<L;
    }

然後堆維護輸出就行了

T3

一眼 DP 結果發現是容斥

然後寫了個暴力(\(5pts\)

正解好像是個環

正解還沒寫完,以後補……

T4

第一眼想到預處理出一個點可控制的區間,然後好像有甚麼人類智慧,然後就不會了

然後碼了 100+ 行的暴力還沒碼完……

正解 也是 還沒寫完,以後補……

總結

真的很糖 完美繼承了小奶龍の好習慣

然後很遺憾的是 T1 已經十分接近 \(Accept\) 了,還有 T1 的另外 \(30pts\) 部分分沒想到去碼(尤其是鏈那個)……

\(\LARGE 唐\)