[HDU5977]Garden of Eden

description

题面

solution

点分治枚举路径板板题。。

void getroot(int u,int fa){
    sz[u]=1;f[u]=0;
    for(RG int i=head[u];i;i=nxt[i]){
        RG int v=to[i];if(v==fa||vis[v])continue;
        getroot(v,u);sz[u]+=sz[v];
        f[u]=max(f[u],sz[v]);
    }
    f[u]=max(f[u],sum-sz[u]);
    if(f[u]

还要用到一个高维前缀和的玩意儿

//这里是求超集的前前缀和
for(RG int w=0;w

code

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define RG register
using namespace std;
const int N=50010;
typedef long long ll;
typedef double dd;
inline int read(){
    RG int data=0,w=1;RG char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')w=-1,ch=getchar();
    while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
    return data*w;
}

void file(){
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
}

int n,k,root,sum,s[N],d[N];ll ans;
int head[N],nxt[N<<1],to[N<<1],val[N<<1],cnt;
void add(int u,int v){
    to[++cnt]=v;
    nxt[cnt]=head[u];
    head[u]=cnt;
}

int sz[N],dep[N],f[N];bool vis[N];
ll tot[20][1<<10],t[1<<10],ss[1<<10];
void getdeep(int u,int fa){
    t[dep[u]]++;
    for(RG int i=head[u];i;i=nxt[i]){
        RG int v=to[i];if(v==fa||vis[v])continue;
        dep[v]=dep[u]|(1<<(s[v])-1);getdeep(v,u);
    }
}
void calc(int u,int v){
    dep[v]=(1<<(s[u]-1))|(1<<(s[v]-1));
    for(RG int i=0;i<(1<

转载于:https://www.cnblogs.com/cjfdf/p/9387773.html

你可能感兴趣的:([HDU5977]Garden of Eden)