HDU 5977 Garden of Eden——点分治

上来按照dp的思想没什么头绪,因为5e4*(1<<10)有点大,所以往暴力上想了,树上暴力的话一般是往点分治上想,稍加思考发现这题只要枚举子集就可以在n(log(n))^2内解决,注意root是全局变量会改变,要存一下,因为这个直接自闭

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 5e4 + 10;
const int INF = 0x3f3f3f3f;
typedef long long LL;
int N, K, all, a[maxn], vis[maxn];
LL ans;
vector G[maxn];
int sz[maxn], dp[maxn], root, SZ;
vector sta;
LL num[1500];
void getroot(int f, int u) {
    sz[u] = 1, dp[u] = 0;
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if (v == f || vis[v]) continue;
        getroot(u, v);
        sz[u] += sz[v];
        dp[u] = max(dp[u], sz[v]);
    }
    dp[u] = max(dp[u], SZ - sz[u]);
    if (dp[u] < dp[root]) root = u;
}
void getsta(int f, int u, int s) {
    sta.push_back(s);
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        if (v == f || vis[v]) continue;
        getsta(u, v, (s|(1<

 

你可能感兴趣的:(思维)