题目链接:http://codeforces.com/contest/746/problem/G


mamaya,不知道YY了一个什么做法就这样过去了啊 2333

首先我显然可以随便构造出一棵树满足他所给出的深度要求。

但是他还对于叶子节点的数目有要求。

考虑首先构造一棵树最大化在满足给出的深度条件下最大化叶子节点的个数。

显然对于每一层的节点让它们的父亲都指向上一层的同一个点的话就会有最多的叶子节点。

好,接下来考虑如何减少叶子结点。

我就是随便贪心搞的(也许可以被叉?)

按照深度从小到大枚举所有的点,如果这个点$x$是叶子节点,找到他的上一层是某一个也是叶子节点的点$y$,并将$x$的父亲修改为$y$,同时还要注意到修改父亲之后,$x$原本的父亲也可能再度变回叶子节点。这些东西都用一个$vector$来维护就可以了。

复杂度:${O(n)}$


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 1001000
#define llg int
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,deep[maxn],c[maxn],a[maxn],du[maxn],dad[maxn],t,k,db[maxn],tot;
vector<llg>d[maxn]; inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} int main()
{
yyj("G");
cin>>n>>t>>k;
for (llg i=;i<=t;i++) a[i]=getint(),c[i]=a[i];
llg p=;
db[]=;
for (llg i=;i<=n;i++)
{
if (c[p]==) p++;
dad[i]=db[p-]; deep[i]=p;
du[db[p-]]++;
if (!db[p]) db[p]=i;
c[p]--;
}
for (llg i=;i<=n;i++) if (!du[i]) {d[deep[i]].push_back(i); tot++;}
if (tot<k) {cout<<-; return ;}
for (llg i=;i<=n;i++)
if (!du[i])
{
if (tot==k) break;
if (d[deep[i]-].size()!=)
{
du[dad[i]]--;
if (du[dad[i]]==){ tot++; d[deep[dad[i]]].push_back(dad[i]);}
du[d[deep[i]-][d[deep[i]-].size()-]]++;
tot--;
dad[i]=d[deep[i]-][d[deep[i]-].size()-];
d[deep[i]-].pop_back();
}
}
if (tot!=k) {cout<<-; return ;}
cout<<n<<endl;
for (llg i=;i<=n;i++) printf("%d %d\n",dad[i],i);
return ;
}

Codeforces 746 G. New Roads的更多相关文章

  1. Codeforces Round #386 (Div. 2)G. New Roads [构造][树]

    题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...

  2. 【codeforces 746G】New Roads

    [题目链接]:http://codeforces.com/problemset/problem/746/G [题意] 给你3个数字n,t,k; 分别表示一棵树有n个点; 这棵树的深度t,以及叶子节点的 ...

  3. [codeforces 549]G. Happy Line

    [codeforces 549]G. Happy Line 试题描述 Do you like summer? Residents of Berland do. They especially love ...

  4. Codeforces 191C Fools and Roads(树链拆分)

    题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数.然后有M次操作,每次从u移动到v.问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数 ...

  5. CodeForces 794 G.Replace All

    CodeForces 794 G.Replace All 解题思路 首先如果字符串 \(A, B\) 没有匹配,那么二元组 \((S, T)\) 合法的一个必要条件是存在正整数对 \((x,y)\), ...

  6. Codeforces 806 D.Prishable Roads

    Codeforces 806 D.Prishable Roads 题目大意:给出一张完全图,你需要选取其中的一些有向边,连成一个树形图,树形图中每个点的贡献是其到根节点路径上每一条边的边权最小值,现在 ...

  7. Codeforces 1207 G. Indie Album

    Codeforces 1207 G. Indie Album 解题思路 离线下来用SAM或者AC自动机就是一个单点加子树求和,套个树状数组就好了,因为这个题广义SAM不能存在 \(len[u] = l ...

  8. codeforces 659 G. Fence Divercity 组合数学 dp

    http://codeforces.com/problemset/problem/659/G 思路: f(i,0/1,0/1) 表示到了第i个,要被切的块开始了没有,结束了没有的状态的方案数 递推看代 ...

  9. Codeforces 803 G. Periodic RMQ Problem

    题目链接:http://codeforces.com/problemset/problem/803/G 大致就是线段树动态开节点. 然后考虑到如果一个点还没有出现过,那么这个点显然未被修改,就将这个点 ...

随机推荐

  1. Redhat 简单本地yum 配置

    Redhat 简单本地yum 配置 一.将redhat 系统的镜像挂载到系统上 Vmware Workstion 环境下: [虚拟机设置]--[硬件]--[CD/DVD]--[使用ISO映像文件]-- ...

  2. [转载] mysql 索引中的USING BTREE 的意义

    索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. 根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总 ...

  3. jquery遍历获取每一行数据进行对比

    $("#dtlTable tr:gt(0)").each(function(i){ var orderQtyBy = $("input[name='orderQtyBys ...

  4. flask框架----flask基础

    知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref,werkzeug,uwsgi 2.实例化Flask对象,里面是有参数的 app = Flask(__name__,templ ...

  5. \r\n回车换行\r回车\n换行的区别

    在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来自于此)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候 ...

  6. Eloquent JavaScript #02# program_structure

    第一章中作者介绍了各种值,但是这些独立的值是没有意义的,只有当值放在更大的框架的时候才会彰显它们的价值.所以第二章开始介绍程序结构. 1.var VS. let 以及 const 作者推荐用 let ...

  7. Linux内核启动流程与模块机制

    本文旨在简单的介绍一下Linux的启动流程与模块机制: Linux启动的C入口位于/Linux.2.6.22.6/init/main.c::start_kernel() 下图简要的描述了一下内核初始化 ...

  8. Golang字符串函数认识(一)

    package main import ( "fmt" "strings" "strconv" ) func main(){ //返回字符串 ...

  9. fjwc2019 D3T1 签到题 (贪心)

    #184. 「2019冬令营提高组」签到题 每次询问接近O(1).......考虑贪心 怎么贪心呢? 对于相邻的两个数,我们要保证异或x后单调不降 我们找到两个数二进制上最高的相异位 当左边的数相异位 ...

  10. spring boot mvc系列-静态资源配置与MappingHandler拦截器

    静态资源配置 Spring Boot 默认将 /** 所有访问映射到以下目录: classpath:/static classpath:/public classpath:/resources cla ...