传送门

文章目录

  • 题意:
  • 思路:

题意:

给你n,dn,dn,d,让你构造有nnn个点的二叉树,他们每个节点深度和为ddd。
n,d≤3000n,d\le 3000n,d≤3000.

思路:

先考虑不能构造出来的情况,设sumsumsum为最小的深度和,那么sum>dsum>dsum>d或n∗(n−1)2<d\frac{n*(n-1)}{2}<d2n∗(n−1)​<d的时候无解。
考虑构造的深度最小的情况,我们让每个点iii的父亲等于⌊i2⌋\left \lfloor \frac{i}{2} \right \rfloor⌊2i​⌋即可,这样深度最小,我们先让d=d−sumd=d-sumd=d−sum。记最长链的最下端的编号为ppp,那么当我们depth[p]−depth[i]+1<ddepth[p]-depth[i]+1<ddepth[p]−depth[i]+1<d的时候,我们直接让iii跑到ppp的下面,让后将ppp更新为iii就好了。如果depth[p]−depth[i]+1>=ddepth[p]-depth[i]+1>=ddepth[p]−depth[i]+1>=d,那么说明如果跳到这个点深度就多了,那么我们就向上找ppp的父亲,每跳一次,就让d−−d--d−−,直到ddd为000,将iii放到跳到的点的下面就好了。

// Problem: E. Construct the Binary Tree
// Contest: Codeforces - Codeforces Round #624 (Div. 3)
// URL: https://codeforces.com/contest/1311/problem/E
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,d;
int depth[N],fa[N];int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);int _; scanf("%d",&_);while(_--){scanf("%d%d",&n,&d);int sum=0; depth[0]=-1; int root=1;for(int i=1;i<=n;i++) {if((i&(i-1))==0) root=i;depth[i]=depth[i/2]+1,fa[i]=i/2,sum+=depth[i];}if(sum>d||d>n*(n-1)/2) { puts("NO"); continue; }d-=sum;if(!d){puts("YES");for(int i=2;i<=n;i++) printf("%d ",fa[i]);puts("");continue;}for(int i=n;i>=1;i--){if((i&(i-1))==0) continue;int cnt=depth[root]-depth[i]+1;if(cnt<d){d-=cnt;depth[i]=depth[root]+1;fa[i]=root;root=i;}else {d=cnt-d;while(d&&root!=1) root=fa[root],d--;fa[i]=root; depth[i]=depth[root]+1;puts("YES");for(int i=2;i<=n;i++) printf("%d ",fa[i]);puts("");break;}} }return 0;
}
/**/

Codeforces Round #624 (Div. 3) E. Construct the Binary Tree 思维 + 构造相关推荐

  1. Codeforces Round #706 (Div. 2) E. Garden of the Sun 思维构造

    传送门 题意: 给你一个n×mn×mn×m的矩阵,其中包含字符′.′'.'′.′和′X′'X'′X′,你可以将任何′.′'.'′.′改成′X′'X'′X′,现在问你能否通过修改一些′.′'.'′.′来 ...

  2. Codeforces Round #701 (Div. 2) D. Multiples and Power Differences 思维构造

    传送门 题意: 给定一个矩阵aaa,让你构造一个矩阵bbb,要求矩阵bbb的每个元素是aaa对应位置元素的倍数,且矩阵bbb的每两个相邻元素相差为k4(k>=1)k^4(k>=1)k4(k ...

  3. Codeforces Round #624 (Div. 3) D. Three Integers 数论

    传送门 文章目录 题意: 思路: 题意: 给定A,B,CA,B,CA,B,C,找到一个三元组(a,b,c)(a,b,c)(a,b,c),使得aaa是bbb的因子,bbb是ccc的因子,且abs(A−a ...

  4. Codeforces Round #732 (Div. 2) C. AquaMoon and Strange Sort 思维

    传送门 文章目录 题意: 思路: 题意: 给你nnn个数,每个数初始方向是向右,每次可以交换相邻两个位置并且将这两个位置的方向调换,问这个序列的最终状态能否是非递减且方向都向右. n≤1e5,ai≤1 ...

  5. Codeforces Round #588 (Div. 2) D. Marcin and Training Camp 思维

    传送门 文章目录 题意: 思路: 题意: 有nnn个人,每个人都有一个能力值bib_ibi​以及他会的技能aia_iai​,当他会第xxx个技能的时候,aia_iai​的第xxx位是111.定义当xx ...

  6. Codeforces Round #727 (Div. 2) E. Game with Cards dp + 思维

    传送门 文章目录 题意: 思路: 题意: 初始有左右手,上面各有一个数字为000的卡牌,每次都有一个新卡kik_iki​,你可以将其放在左手或者右手,使两只手上的卡片范围在[ll,i,rl,i][l_ ...

  7. Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树

    传送门 文章目录 题意: 思路 题意: 给你一张nnn个点mmm个边的图,mmm条边是给定的,要求你给未给定的边赋值一个边权,使得所有边权异或和为000,求所有满足这种情况的图中最小生成树边权和最小的 ...

  8. Codeforces Round #632 (Div. 2) C. Eugene and an array 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给定一个长度为nnn的序列aaa,定义一段区间为好区间是这段区间的所有连续子区间的和都不为000,求好区间的个数. 思路: 套路题,定义aia_iai​的前缀 ...

  9. Codeforces Round #462 (Div. 2) C. A Twisty Movement dp + 思维转换

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的只包含1,21,21,2的序列aaa,你可以至多翻转一段区间,求翻转之后最长非递减子序列是多长. 思路: 考虑如果翻转的话,翻转的子区间 ...

最新文章

  1. 2019年上半年收集到的人工智能GAN干货文章
  2. combobox DataGridView
  3. 荣耀v40可以升级华为鸿蒙,网传荣耀V40机型也能升级鸿蒙OS 首批更新机型有望是这5款...
  4. 前端学习(1539):hello world
  5. JavaScript eval() 函数,计算某个字符串,并执行其中的的 JavaScript 代码。
  6. 思科虚拟机配置dhpc服务器,思科模拟器配置DHCP
  7. Java 和C# 最大的不同是对底层的控制能力不同
  8. LoadRunner录制第一个脚本Virtual User Generator
  9. noip 2010 数字统计
  10. 三维重建_基于图像的三维模型重建_稠密点云重建
  11. hyperledger fabric cryptogen: command not found
  12. PUTTY官网下载地址
  13. 【第007问 Unity中如何进行UV动画?】
  14. S102公路第I标段施工图设计--河北工程大学土木工程学院
  15. 拼多多狂砸百亿补贴的iphone是真的吗?
  16. 群体遗传学瓶颈效应bottleneck effect
  17. python-字符串的操作方法_format_列表的操作
  18. xshell .swp文件
  19. 一个C#开发的、跨平台的服务器性能监控工具
  20. ThinkPad F1按键常亮且喇叭无声音

热门文章

  1. composer切换源_Composer具体安装方法
  2. 怎么做图片文字二维码一起_怎么做?才能让文字编排更出彩
  3. 如何判断对象是不是出轨了?
  4. 两点之间直线只有一条,曲线却有无数条,哪条才是最短的?
  5. 22届腾讯暑期实习三轮面试面经(已oc)
  6. tars框架php,TarsPHP: TARS-PHP是针对php使用tars二进制协议,以及tars平台整体运维、RPC等一系列能力的解决方案...
  7. java 判断object类型_Java 类继承机制
  8. java获取jsp对象的属性_java-从jsp el中的对象获取布尔属性
  9. [SpringBoot2]HelloWorld
  10. 如何找到Eclipse左侧项目栏