zoukankan      html  css  js  c++  java
  • E. Fib-tree 题解(思维)

    题目链接

    题目大意

    给你一棵节点为(n(1leq n leq 2e5))的树

    你要判断这颗树是否是斐波树

    满足下列两点之一即为斐波树

    1:删除一些边,使得这颗树变为两棵斐波树

    2:只有一个节点

    斐波树要求节点数量必须是斐波那契值

    题目思路

    emmm这个真是毒瘤

    这个用数学归纳法证明能删则删就能判断正确性

    证明链接

    时间复杂度也有点玄学

    子树的节点本质上也在减少,每次节点数差不多是减半,个人认为这个复杂度差不多(O(n imes logn))

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    typedef pair<int,int> pii;
    typedef  long long ll;
    const int maxn=2e5+5,mod=1e7;
    int n;
    int head[maxn],cnt;
    int fac[maxn];
    int sz[maxn];
    bool vis[maxn];// 判断是否为斐波那契数
    vector<pii > vec;
    unordered_map<int,int> mp[maxn]; //判断这条边是否已经被拆了
    struct edge{
        int to,next;
    }e[maxn<<1];
    void add(int u,int v){
        e[++cnt]={v,head[u]};
        head[u]=cnt;
    }
    void get_size(int son,int fa){// 获得每个节点的子树节点数量
        vec.push_back({son,fa});
        sz[son]=1;
        for(int i=head[son];i;i=e[i].next){
            if(e[i].to==fa||!mp[son][e[i].to]) continue;
            get_size(e[i].to,son);
            sz[son]+=sz[e[i].to];
        }
    }
    bool check(int son,int fa,int num){
        if(!vis[num]) return 0;
        if(num==1) return 1;
        vec.clear();// vec代表son子树下的所有节点
        get_size(son,fa);
        for(int i=0;i<vec.size();i++){
            int x=vec[i].fi;
            int y=vec[i].se;
            if(x==son) continue;
            int temp=sz[x];// 要用一个变量保存因为sz[x]会改变
            if(vis[temp]&&vis[num-temp]){
                mp[x][y]=mp[y][x]=0;// 代表这条边没了
                return check(x,y,temp)&&check(y,x,num-temp);
            }
        }
        return 0;
    }
    int main(){
        fac[0]=fac[1]=1;
        vis[1]=1;
        for(int i=2;i<=26;i++){
            fac[i]=fac[i-1]+fac[i-2];
            vis[fac[i]]=1;
        }
        scanf("%d",&n);
        for(int i=1,u,v;i<=n-1;i++){
            scanf("%d%d",&u,&v);
            add(u,v),add(v,u);
            mp[u][v]=mp[v][u]=1;
        }
        printf(check(1,1,n)?"YES
    ":"NO
    ");
        return 0;
    }
    
    
    卷也卷不过,躺又躺不平
  • 相关阅读:
    研修班第四次课笔记
    形象革命——穿搭
    对管理者的几点要求
    全链路压测
    项目管理最忌的5件事,千万不要忽视!
    2018年计划小目标(9月)PMP
    NLP是什么
    (深度好文)重构CMDB,避免运维之耻
    《转》我们不得不面对的中年职场危机
    项目管理,让自己更从容
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/14489034.html
Copyright © 2011-2022 走看看