题目链接:http://codeforces.com/contest/1098/problem/C

题意:

给你n个点要你组成一棵以结点1为根的树,使得所有结点的子树的大小和为s,且在这种情况下使得分支系数最小,分支系数就是结点的最大儿子数量。

做法:

难啊难啊。。我是真不容易想到啊。。。

容易想到的是,如果所有的结点都在一条链上,那很明显是子树结点和最大的n*(n+1)/2,如果所有的结点都绑在1上,那就是最小的2*n-1,所以如果s不符合这个范围的话那肯定就是不满足条件直接NO的。

但是如果s在这两个数之间的话,其实可以发现一定有正确答案,为什么呢,因为我们只要先把整个树看成一条链,在保证分支系数最小的情况下,每次都将最下面的结点往上面还没到最大分支系数的结点上挂,那么最后一定会剩下一个正好与s差一点的结点,那这个结点只要放在和根结点正好差那么多的地方就可以了。等于是,每次都减去距离和,直到找到答案这样的做法。


#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=100005;
ll n,s;
ll dep[maxn];
int ck(ll mid){ll nowp=1,dep=1,res=n,sum=0;while(res>0){ll lon=min(res,nowp)*dep;//算出当前层可以为子树大小加上多少sum+=lon;//如果超了就不行if(sum>s) return 0;res-=min(nowp,res);nowp*=mid;dep++;//算出到下一层还需要加多少点}return 1;
}
int main(){scanf("%lld%lld",&n,&s);if(s<2*n-1||(n+1)*n/2<s) return 0*printf("NO\n");ll l=1,r=n-1,mide=-1;while(l<=r){ll mid=(l+r)/2;if(ck(mid)){r=mid-1; mide=mid;}else l=mid+1;}ll sum=n*(n+1)/2,top=2;rep(i,1,n){dep[i]=1;}for(int i=n;i>=1;i--){if(dep[top]==dep[top-1]*mide) top++;if(sum-s>i-top){//如果这里的点移到最前面去还是比s要多,那么就移过去dep[top]++,dep[i]--;sum-=(i-top);}else{//否则直接把i处的点移到i-(sum-s)处dep[i-(sum-s)]++;dep[i]--;sum=s;break;}}vector<int> ve[maxn];ve[1].push_back(1);int now=1,f=0,nowc=2;printf("YES\n");while(now<n){for(int j=0;j<dep[nowc]&&now<n;j++){printf("%d%c",ve[nowc-1][j/mide],now==n-1?'\n':' ');ve[nowc].push_back(now+1);now++;}nowc++;}return 0;
}

Codeforces Round #530 (Div. 1) C. Construct a tree 想法相关推荐

  1. Codeforces Round #624 (Div. 3) E. Construct the Binary Tree 思维 + 构造

    传送门 文章目录 题意: 思路: 题意: 给你n,dn,dn,d,让你构造有nnn个点的二叉树,他们每个节点深度和为ddd. n,d≤3000n,d\le 3000n,d≤3000. 思路: 先考虑不 ...

  2. Codeforces Round #453 (Div. 1) D. Weighting a Tree 构造 + dfs树

    传送门 文章目录 题意: 思路: 题意: 给你一颗nnn个点的图,每个点都有一个点权cic_ici​,要求你给每个边赋一个权值kik_iki​,要求对于每个点与他相连的边的权值之和等于这个点的点权ci ...

  3. Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造

    B. Invariance of Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/576/ ...

  4. Codeforces Round #530 (Div. 1) 1098A Sum in the tree

    A. Sum in the tree Mitya has a rooted tree with nn vertices indexed from 11 to nn, where the root ha ...

  5. Codeforces Round #530 Div. 1 自闭记

    A:显然应该让未确定的大小尽量大.不知道写了啥就wa了一发. #include<iostream> #include<cstdio> #include<cmath> ...

  6. Codeforces Round #530 (Div. 2)

    RANK :2252 题数 :3 补题: D - Sum in the tree 思路:贪心 把权值放在祖先节点上 ,预处理 每个节点保存 他与他儿子中 权值最小值即可. 最后会有一些叶子节点依旧为 ...

  7. Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

    链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...

  8. Codeforces Round #263 (Div.1) B. Appleman and Tree

    题目地址:http://codeforces.com/contest/461/problem/B 题目大意:给一棵树.每一个点为白色或黑色.切断一些边,使得每一个连通块有且仅有一个黑点,问划分方案数. ...

  9. Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路

    题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...

最新文章

  1. h5 getUserMedia error PermissionDeniedError
  2. php点击字切换验证码,PHP生成图片验证码、点击切换实例 Web程序 - 贪吃蛇学院-专业IT技术平台...
  3. php 数组到字符串的转换,php – 数组到字符串到数组的转换
  4. Ubuntu无法使用快捷键ctrl + alt + T打开命令行终端或唤醒终端窗口的解决办法
  5. java 双重检查锁定_Java双重检查锁定
  6. 操作系统——Linux 虚拟内存和物理内存的理解
  7. Fragstats 提示错误与警告
  8. 2021年高压电工考试内容及高压电工考试报名
  9. matlab norm函数_机器人手眼标定MATLAB及C++实现(二十九)
  10. 华硕n54u mysql_改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件(私人云储存 ari
  11. 计算机技术与软件专业技术资格(水平)考试
  12. iOS12加密相册、保险箱打开就闪退的,关闭4g和WiFi即可正常使用
  13. leetcode_Restore IP Addresses
  14. Linux 目录初识
  15. MERGE操作学习总结
  16. Hexo 发布博客实现图文并茂
  17. 10个程序员必上的网站
  18. 08.env和set命令详解
  19. 安路FPSoC®产品SF1系列全新发布,高集成低功耗,助力实现多种应用场景
  20. Linux设置网络缓冲区大小(TCP/UDP)

热门文章

  1. java清除referer_Java实现跳过网站Referer校验
  2. 【个人成长】001- 4 个步骤提升你的复盘能力
  3. Word中自动生成参考文献
  4. UGUI——判断是否点击在UI上
  5. 电脑测试有声音软件没声音,Win7系统电脑没有声音了是声卡的问题吗?该怎么测试声卡?...
  6. SSD 驱动ssw101b 无线wifi
  7. Deep Link URL Scheme Universal Link
  8. 关于中国央行法定数字货币,你可能不知道的7件事
  9. wps文字处理 WPS实用教程 看乔峰如何破解PPT转DOC难题?
  10. .bashrc 添加点环境变量