Tree Ext
这道题相当于把3道题合了起来。
要求修复的边中恰好有 k 条白边:
五颜六色的幻想乡(附拉格朗日插值法求多项式系数 )
+
bzoj2654 tree(WQS二分 新科技get)
是最小生成树计数而非生成树计数:
BZOJ1016」[JSOI2008] 最小生成树计数
具体可以看看这篇博客,代码中的注释也解释得较清楚
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
const int N=105;
const int M=10005;
int n,m,k,l,r;
int tot,fa[N],pa[N],id[N],num[N];
int x[N],y[N],res[N],coef[N],ans[N];
struct edge{
int u,v,w,c;
}e[M];
bool cmp(edge a,edge b){
if(a.w==b.w) return a.c<b.c;
return a.w<b.w;
}
int find(int u){
if(fa[u]==u) return u;
return fa[u]=find(fa[u]);
}
int get(int u){
if(pa[u]==u) return u;
return pa[u]=get(pa[u]);
}
int power(int a,int b){
a%=mod;
int res=1;
while(b){
if(b&1) res=res*a%mod;
b>>=1;a=a*a%mod;
}
return res;
}
bool check(int mid){
for(int i=1;i<=m;i++)
if(!e[i].c) e[i].w+=mid;
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
int cnt=0;
for(int i=1,j=0;j<n-1;i++){
int u=find(e[i].u),v=find(e[i].v);
if(u!=v){
fa[v]=u;j++