题目链接:G. New Roads

题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树。

分析:

考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点

   那么答案很简单,就是对(a[i]-1)求和再加1(每一层的结点都集中在上一层的一个结点上)

     同理,我们考虑最少能有多少叶子结点,就是把上一个的答案再减去min(a[i]-1, a[i-1]-1)的求和,就是每一层的结点都尽可能的分散在上一层的结点

   根据这个,那么如果要求有k个叶子节点,k在最大值与最小值之间,就可以生成出这棵树了

   生成的方法,和构造起来差不多,就是先求出最大值与k的差T,然后每一层处理时,如果T>0,就使这一层尽可能的分散在上一层结点上,然后T减少一点

   直到T为0,之后的层都直接集中在上一层的一个结点即可

详情见代码

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; int n,t,k,a[],s1,s2; int main()
{
scanf("%d %d %d",&n,&t,&k);
for(int i=;i<=t;++i) {scanf("%d",a+i);s1+=a[i];}s1-=t-;
s2=s1;for(int i=;i<=t;++i) s2-=min(a[i]-,a[i-]-);
if(s2<=k&&k<=s1)
{
printf("%d\n",n);
for(int i=;i<=a[]+;++i) printf("1 %d\n",i);//先处理1
int tot=+a[],cnt=s1-k;
for(int i=;i<=t;++i)
{
int tt=min(a[i]-,a[i-]-),cou=;//tt是第i深度形成的边数
while(cnt&&tt)
{
if(cou) {tt--,cnt--;}
printf("%d %d\n",tot-a[i-]+cou,tot+cou);//每次都+1
cou++;
}
if(cnt==||tt==)//若还有多余的边,则加到第一个结点
{
while(cou<a[i])
printf("%d %d\n",tot-a[i-],tot+cou++);
}
tot+=a[i];//结点序增加
}
}
else puts("-1");
}

Codeforces Round #386 (Div. 2)G. New Roads [构造][树]的更多相关文章

  1. Codeforces Round #582 (Div. 3)-G. Path Queries-并查集

    Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...

  2. Codeforces Round #275 (Div. 1)A. Diverse Permutation 构造

    Codeforces Round #275 (Div. 1)A. Diverse Permutation Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 ht ...

  3. Codeforces Round #386 (Div. 2) C D E G

    一场比较简单的题 比较脑洞 C 如果坐车比较快的话 先走不如等车 所以最后的ans是min(纯走路,纯坐车) 讨论一下坐车时间 D 因为k一定是>=1的 所以当a=b的时候 GBGBGB这样间隔 ...

  4. Codeforces Round #547 (Div. 3) G 贪心

    https://codeforces.com/contest/1141/problem/G 题意 在一棵有n个点的树上给边染色,连在同一个点上的边颜色不能相同,除非舍弃掉这个点,问最少需要多少种颜色来 ...

  5. Codeforces Round #541 (Div. 2) G dp + 思维 + 单调栈 or 链表 (连锁反应)

    https://codeforces.com/contest/1131/problem/G 题意 给你一排m个的骨牌(m<=1e7),每块之间相距1,每块高h[i],推倒代价c[i],假如\(a ...

  6. Codeforces Round #481 (Div. 3) G. Petya's Exams

    http://codeforces.com/contest/978/problem/G 感冒是真的受不了...敲代码都没力气... 题目大意: 期末复习周,一共持续n天,有m场考试 每场考试有如下信息 ...

  7. Codeforces Round #346 (Div. 2) G. Fence Divercity dp

    G. Fence Divercity 题目连接: http://www.codeforces.com/contest/659/problem/G Description Long ago, Vasil ...

  8. Codeforces Round #677 (Div. 3) G. Reducing Delivery Cost(dijkstra算法)

    题目链接:https://codeforces.com/contest/1433/problem/G 题解 跑 \(n\) 遍 \(dijkstra\) 得到任意两点间的距离,然后枚举哪一条边权为 \ ...

  9. Codeforces Round #603 (Div. 2) E. Editor(线段树)

    链接: https://codeforces.com/contest/1263/problem/E 题意: The development of a text editor is a hard pro ...

随机推荐

  1. Cooking Schedule Problem Code: SCHEDULE(优先队列)

    Cooking Schedule Problem Code: SCHEDULE Chef is a well-known chef, and everyone wishes to taste his ...

  2. [Bzoj1821][JSOI2010]Group 部落划分 Group(并查集)(二分答案)

    1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2949  Solved: 1392[S ...

  3. Ubuntu 16.04关闭Alt+鼠标左键移动窗口(转)

    1.打开终端,菜单-编辑-配置文件首选项-命令,勾上“以登录Shell方式运行命令”,重启终端. 2.在终端输入 gsettings get org.gnome.desktop.wm.preferen ...

  4. linux文件描述符fd(windows下的句柄)

    在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件 fd:file descriptor 文件描述符0,1,2分别给了标准输入.标准输出和错误输出. ls - ...

  5. Java SpringMVC实现PC端网页微信扫码支付完整版

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...

  6. 矩阵奇异值分解(SVD)

    转自:https://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html  (感谢,讲解的太好了) 在机器 ...

  7. 【深度探索c++对象模型】Function语义学之成员函数调用方式

    非静态成员函数 c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率.编译器内部已将member函数实体转换为对等的nonmember函数实体. 转化步骤: 1.改写函数原型以安 ...

  8. 【APUE】关于信号的一些常用函数

    kill和raise函数 #include <signal.h> int kill(pid_t pid,int signo); int raise(int signo);//两个函数返回值 ...

  9. Ajax系列之四:问题总结

    1.最经典的就是ie下的缓存问题了.  假设使用的是get.那么在ie下出现缓存问题.导致代码仅仅运行一次. 解决的方法就是加时间戳或者随机数,使url变为唯一,这样就不会出现ie  下的缓存问题了, ...

  10. POJ 1679 The Unique MST 推断最小生成树是否唯一

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22715   Accepted: 8055 D ...