高维前缀和是一种计数方法,只是短短的几行,用来计算包含i的集合的总个数。其他部分应该都ok,详见代码。
#include
#include
#include
#include
using namespace std;
#define MS(x,y) memset(x,y,sizeof(x))
typedef long long LL;
const int MAXN=5e4+5;
struct Edge{
int v,nxt;
}edge[MAXN<<1];
int head[MAXN],edgenum;
void addedge(int u,int v){
edge[edgenum].v=v;
edge[edgenum].nxt=head[u];
head[u]=edgenum++;
}
int n,k,K;
int col[MAXN];
LL ans;
int root,max_sub;
int siz[MAXN];
LL cnt[MAXN],cnt1[MAXN];
bool used[MAXN];
void findroot(int u,int f,int num){
siz[u]=1;
int K=0;
for(int i=head[u];~i;i=edge[i].nxt){
int &v=edge[i].v;
if(used[v]||v==f) continue;
findroot(v,u,num);
K=max(K,siz[v]);
siz[u]+=siz[v];
}
K=max(K,num-siz[u]);
if(K=0;--j){ //高维前缀和
if(!((1<