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