• G. Game Design


    #include<bits/stdc++.h>
    #define inf 1e7
    #define ll long long 
    #define int long long 
    #define ull unsigned long long 
    #define PI acos(-1.0)
    #define PII pair<int,int>
    using namespace std;
    const int N = 1e5+7;
    const int p = 998244353;
    int k,num,pa[N],c[N];
    void dfs(int fa,int w,int val){//父亲 任务 权值 
        int u = ++num;
    //    cout<<"=== "<<u<<"  "<<fa<<"  "<<w<<"  "<<val<<"
    ";
        pa[u] = fa;
        c[u] = val;
        w--;
        if(w == 0){
            return ;
        }
        int l = (int)sqrt(w);
        while(w%l!=0) l--;
        int r = w/l;
        dfs(u,l,val>>1ll);
        dfs(u,r,val>>1ll);
    }
    void solve(){
        num = 0;
        scanf("%lld",&k);
        if(k==1){
            printf("2
    1
    2 1
    ");
            return ;
        }
        dfs(0,k,(1ll<<29));
        
        printf("%lld
    ",num);
        for(int i=2;i<=num;++i){
            printf("%lld ",pa[i]);
        }
        printf("
    ");
        for(int i=1;i<=num;++i){
            printf("%lld ",c[i]);
        }
    }
    signed main(){
        int t=1;
        //scanf("%lld",&t);
        for(int _=1;_<=t;++_){
            solve();
        }
        return 0;
    }

     构造一棵节点带权值的树。构造完成后,树上的每个叶子节点都会出现一个怪物,怪物会自底向上进攻根节点,现在你能够在任意个节点建造防御塔,防御塔的建造花费是你构造是给出的点权 cici ,以建造防御塔后的节点为根的子树中的所有怪物都会被防御塔杀死。现在给定一个正整数 KK 代表以最小花费修建防御塔拦截杀死怪物的不同方案数,要求给出这个构造。

    二叉树构建,父节点的方案数等与两个儿子的方案数 相乘+1

    尽量使得两个子树 高度均匀,这样就不会出现单条链的情况,因为我不清楚单条链的情况下 ,总个数会不会超出去,看别人的题解好像是可以的

    由于题目要求个数大于等于2 ,所以特判1的情况

  • 相关阅读:
    关于Dijkstra三种堆速度的研究
    [BZOJ1041][HAOI2008]圆上的整点[数论]
    [BZOJ2482][Spoj1557] Can you answer these queries II[线段树]
    [CF600E]Lomsat gelral[dsu on tree/树上启发式合并]
    [BZOJ3495]PA2010 Riddle[2-SAT]
    [9.26模拟] 伪造
    [bzoj4722] 由乃
    [bzoj2004] 公交线路
    [51nod1314] 定位系统
    [51nod1143] 路径和树
  • 原文地址:https://www.cnblogs.com/PdrEam/p/15545032.html
Copyright © 2020-2023  润新知