首页 > 技术文章 > G. Game Design

PdrEam 2021-11-12 15:56 原文

#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<<"\n";
    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\n1\n2 1\n");
        return ;
    }
    dfs(0,k,(1ll<<29));
    
    printf("%lld\n",num);
    for(int i=2;i<=num;++i){
        printf("%lld ",pa[i]);
    }
    printf("\n");
    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的情况

 

推荐阅读