#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的情况