HDU-5977 树的分治+子集枚举

题目

Garden of Eden

题意

求树上满足条件的点对的个数,条件是在这两点间不经过重复的点能吃到的苹果类型的总数大于 k。

题解

这道题和Tree 这道题相似,用树的分治的方法来做。但 Tree 算的是距离,这道题算的是苹果种类数,所以可以用二进制的方法将状态压缩一下。
还有一个地方需要注意的是,在进行路径合并的时候,需要用子集枚举的方法找到满足要求的所有路径。

代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int MAX = 50005;
vectorG[MAX];
int vis[MAX];
int colour[MAX];
int pre[11];
long long req;

int getSize(int u,int fa){
    int len = G[u].size();
    int sum = 1;
    for(int i=0;i

你可能感兴趣的:(ACM/ICPC)