Codeforces Round #530 (Div. 1) C. Construct a tree 想法
题目链接: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 想法相关推荐
- Codeforces Round #624 (Div. 3) E. Construct the Binary Tree 思维 + 构造
传送门 文章目录 题意: 思路: 题意: 给你n,dn,dn,d,让你构造有nnn个点的二叉树,他们每个节点深度和为ddd. n,d≤3000n,d\le 3000n,d≤3000. 思路: 先考虑不 ...
- Codeforces Round #453 (Div. 1) D. Weighting a Tree 构造 + dfs树
传送门 文章目录 题意: 思路: 题意: 给你一颗nnn个点的图,每个点都有一个点权cic_ici,要求你给每个边赋一个权值kik_iki,要求对于每个点与他相连的边的权值之和等于这个点的点权ci ...
- 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/ ...
- 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 ...
- Codeforces Round #530 Div. 1 自闭记
A:显然应该让未确定的大小尽量大.不知道写了啥就wa了一发. #include<iostream> #include<cstdio> #include<cmath> ...
- Codeforces Round #530 (Div. 2)
RANK :2252 题数 :3 补题: D - Sum in the tree 思路:贪心 把权值放在祖先节点上 ,预处理 每个节点保存 他与他儿子中 权值最小值即可. 最后会有一些叶子节点依旧为 ...
- Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp
链接: http://codeforces.com/contest/462/problem/D 题意: 给定n个点的树, 0为根,下面n-1行表示每个点的父节点 最后一行n个数 表示每个点的颜色,0为 ...
- Codeforces Round #263 (Div.1) B. Appleman and Tree
题目地址:http://codeforces.com/contest/461/problem/B 题目大意:给一棵树.每一个点为白色或黑色.切断一些边,使得每一个连通块有且仅有一个黑点,问划分方案数. ...
- 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 ...
最新文章
- h5 getUserMedia error PermissionDeniedError
- php点击字切换验证码,PHP生成图片验证码、点击切换实例 Web程序 - 贪吃蛇学院-专业IT技术平台...
- php 数组到字符串的转换,php – 数组到字符串到数组的转换
- Ubuntu无法使用快捷键ctrl + alt + T打开命令行终端或唤醒终端窗口的解决办法
- java 双重检查锁定_Java双重检查锁定
- 操作系统——Linux 虚拟内存和物理内存的理解
- Fragstats 提示错误与警告
- 2021年高压电工考试内容及高压电工考试报名
- matlab norm函数_机器人手眼标定MATLAB及C++实现(二十九)
- 华硕n54u mysql_改华硕[N14U N54U]5G 2G的7620老毛子Padavan固件(私人云储存 ari
- 计算机技术与软件专业技术资格(水平)考试
- iOS12加密相册、保险箱打开就闪退的,关闭4g和WiFi即可正常使用
- leetcode_Restore IP Addresses
- Linux 目录初识
- MERGE操作学习总结
- Hexo 发布博客实现图文并茂
- 10个程序员必上的网站
- 08.env和set命令详解
- 安路FPSoC®产品SF1系列全新发布,高集成低功耗,助力实现多种应用场景
- Linux设置网络缓冲区大小(TCP/UDP)
热门文章
- java清除referer_Java实现跳过网站Referer校验
- 【个人成长】001- 4 个步骤提升你的复盘能力
- Word中自动生成参考文献
- UGUI——判断是否点击在UI上
- 电脑测试有声音软件没声音,Win7系统电脑没有声音了是声卡的问题吗?该怎么测试声卡?...
- SSD 驱动ssw101b 无线wifi
- Deep Link URL Scheme Universal Link
- 关于中国央行法定数字货币,你可能不知道的7件事
- wps文字处理 WPS实用教程 看乔峰如何破解PPT转DOC难题?
- .bashrc 添加点环境变量