【树的分治】 HDU 4670 Cube number on a tree

点击打开链接


可将点权转化为三进制

树的分治:根据子树的节点数最小 求出树的重心 保证了复杂度尽量小

对于重心节点 的一棵子树搜一遍得到所有到那个子结点的权值积 与已经搜过的权值积 相乘 然后计算答案

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
const int INF = 1<<30;
const int MAXN = 50005;
const int mod = 100000000;
int n,p[66],k;
int vis[MAXN],siz[MAXN],mx[MAXN],mi,ans,rot;
vectorG[MAXN];
map sta;
map::iterator it;
LL val[MAXN];
LL gao(LL w)
{
    LL ret=0,bas=1;
    for(int j=0;jmx[u]) mx[u]=siz[v];
    }
}
void getroot(int u,int pre,int father){

    if(siz[father]-siz[u]>mx[u]) mx[u]=siz[father]-siz[u];
    if(mx[u]&ds)
{
    if(ds.count(d)) ds[d]++;
    else ds[d]=1;
    for(int i=0;itds;
    for(int i=0;i


你可能感兴趣的:(图论)