题目链接: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. Linux监控平台搭建( zabbix监控)
  2. WCF系列之.net(3.0/3.5)Rest使用示例
  3. 【C++基础学习】二维数组的动态分配及参数传递
  4. linux 双线,linux 双线接入方案
  5. DeFi 保险协议InsurAce将于3月15日在Balancer开启代币首发
  6. sql 缓冲池_监视SQL Server中的内存文员和缓冲池分配
  7. 网站技术架构发展之我见--[引子]
  8. 基于C#的Access MsSQL MySQL 三种数据库访问演示(含源文件Demo)
  9. 下拉选择框 其他_WPS表格下拉菜单的多种做法(一)
  10. 计算机excel无法打开,双击Excel软件无法打开表格文件怎么办?
  11. python图像差分法目标检测_OpenCV实现帧差法检测运动目标
  12. 将文件从ubuntu拷贝到linux开发板
  13. 蓝牙耳机连接笔记本声音卡顿解决办法
  14. 计算机网络的核心概念
  15. 计算机二级Python错题
  16. intel android 平板,IT百科之英特尔芯平板
  17. python日历图_Python干货宝典!玩转内置模块:日历模块
  18. 牛顿?不不不,是牛逼顿
  19. zxing 生成二维码,可设置logo、二维码颜色、白边大小
  20. python numpy 求top-k accuracy指标

热门文章

  1. CCF CSP 201909-4 推荐系统
  2. php生成百度换量 XML文件
  3. mysql字符串转数组,合并结果集,转成数组
  4. 利用循环嵌套,输出九九乘法表。c语言+注释
  5. warning: inline function ‘xxx‘ is not defined问题
  6. Adobe Photoshop CC 2019 for Mac安装所遇问题
  7. 毕业到踏足BIOS一年以来的旅程
  8. 浅谈Geronimo的现状
  9. 三次握手,四次挥手,为什么是三次握手四次挥手
  10. 在service层对集合进行分组处理