設 \(f_\) 表示以 \(i\) 為根的子樹內裡 \(i\) 最近的選擇點的深度為 \(j\)
轉移的話
\((j-dep_x)*2>k\) 直接加上對應的位置
\(0 < (j-dep_x)*2\leq k\) 需要判斷保證選擇的子樹之間的距離要大於 \(k\)
還有一種 \(f_i,dep_i=f_i,dep_+w_i\) 選擇自己的情況
是以下標為深度的轉移,於是長鏈剖分優化一下就行
還***是字尾最大值
code
#include#define int long long
#define rint signed
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int n,k;
int w[1000010],son[1000010],dep[1000010],md[1000010];
int head[1000010],ver[2000010],to[2000010],tot;
vectorf[1000010],vec;
inline void add(int x,int y)
void dfs1(int x,int fa)
}void dfs2(int x,int fa)else f[x].emplace_back(max(w[x],f[x].size()?f[x].back():0ll));
for(int i=head[x],s,t,e;i;i=to[i])else if(2*(d-dep[x])>0)else if(md[y]>dep[x]+k)
if(i>s) vec[i]=max(vec[i],vec[i-1]);
if(d-dep[y]>=0) vec[i]=max(vec[i],f[y][e-(d-dep[y])]);
} for(int i=s;i<=t;i++) f[x][i]=vec[i];
f[y].clear();f[y].shrink_to_fit(); }}
signed main()\) 表示將 \(u,v\) 子樹合併時產生的逆序對的平均數
分別是先選 \(u\) 的情況和先選 \(v\) 的情況
先選了 \(u\) 那麼要加上 \(u\) 的每乙個子樹和 \(v\) 去合併的貢獻,還有 \(g(u,v)\)
由於每個子樹之間互補影響與 \(v\) 的貢獻,所以可以直接加
先選 \(v\) 的同理
還需要乘上乙個係數
最後就是 \(f(u,v)=\fracf(w,v)+g(u,v))+siz_v*(\sum\limits_w f(w,u)+g(v,u))}\)
還有一種情況,就是為祖先關係時,無論如何都會產生貢獻要單獨加上
code#include//#define int long long
#define rint signed
#define mod 1000000007
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int n,rt,ans;
int inv[5000],siz[5000],fa[5000];
int head[5000],ver[10000],to[10000],tot;
int f[5000][5000],g[5000][5000];
inline void add(int x,int y)
inline void md(int &x)
inline int qpow(int x,int k)
return res;
}void dfs(int x,int fath)
}inline int calc(int x,int y)
for(int i=head[y];i;i=to[i])
f[x][y]=1ll*f[x][y]*inv[siz[x]+siz[y]]%mod;
return f[y][x]=f[x][y];
}signed main()
} }printf("%d\n",ans);
return 0;
}
手模前 \(4\) 個,第 \(5\) 個並查集縮一下再染色就行
後面的右手扶牆走,碰到乙個不一樣的顏色就換一種顏色染,最後再手動調整
省選模擬 19 09 11
ps.博主趁資訊課摸魚考的暴零模擬 看門人憑感覺就知道是長鏈剖分,將路徑查分一下,dis u di sv 2 dis lc adis u dis v 2 dis disu disv 2 disl ca 維護fu,if fu,i 表示u的子樹,深度為 i 的點的 dis disdi s最大值 考慮如何...
省選模擬96
容易發現當 k 3 時無解。然後容易證明當 k 3 時,只有 m 3 才是有解的。然後直接做不好做,考慮欽定然後容斥出合法方案。對於 k 3 列舉乙個點,然後計算另乙個的方案數。其他情況類似,欽定滿足條件的角,然後容斥。然後對於每乙個 o n 的式子用組合恒等式大力化簡就可以做到 o 1 了。考慮每...
省選模擬86
首先考慮基礎的dp定義,那麼發現轉移需要的係數只和dp是奇數的點的個數有關,所以將這個東西記錄在dp狀態中就行了。然後推一下dp轉移,發現轉移係數和奇數的點的個數沒有關係,只與是否存在這樣的點有關,所以用01來記錄就可以了。考慮用總方案減去不合法的方案,也就是1號點能到達的點和2號點能到達的點沒有交...