• 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;
    }
    
    
    卷也卷不过,躺又躺不平
  • 相关阅读:
    出差归来
    五一假期的开端
    哭。。。五一这就过拉。。。还没什么感觉那。。。呜呜
    爱姬家族新成员。。。
    大道至简读后感
    假期进度报告
    假期报告
    假期进度报告
    假期进度报告
    假期进度报告
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/14489034.html
Copyright © 2020-2023  润新知