Codeforces 746 G. New Roads

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


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

 

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

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

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

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

 

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

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

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

 

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


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 1001000
10 #define llg int
11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
12 llg n,m,deep[maxn],c[maxn],a[maxn],du[maxn],dad[maxn],t,k,db[maxn],tot;
13 vector<llg>d[maxn];
14 
15 inline int getint()
16 {
17        int w=0,q=0; char c=getchar();
18        while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar(); 
19        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
20 }
21 
22 int main()
23 {
24     yyj("G");
25     cin>>n>>t>>k;
26     for (llg i=1;i<=t;i++) a[i]=getint(),c[i]=a[i];
27     llg p=1;
28     db[0]=1;
29     for (llg i=2;i<=n;i++)
30     {
31         if (c[p]==0) p++;
32         dad[i]=db[p-1]; deep[i]=p;
33         du[db[p-1]]++;
34         if (!db[p]) db[p]=i;
35         c[p]--;
36     }
37     for (llg i=1;i<=n;i++)  if (!du[i]) {d[deep[i]].push_back(i); tot++;}
38     if (tot<k) {cout<<-1; return 0;}
39     for (llg i=1;i<=n;i++)
40         if (!du[i])
41         {
42             if (tot==k) break;
43             if (d[deep[i]-1].size()!=0)
44             {
45                 du[dad[i]]--;
46                 if (du[dad[i]]==0){ tot++; d[deep[dad[i]]].push_back(dad[i]);}
47                 du[d[deep[i]-1][d[deep[i]-1].size()-1]]++;
48                 tot--;
49                 dad[i]=d[deep[i]-1][d[deep[i]-1].size()-1];
50                 d[deep[i]-1].pop_back();
51             }
52         }
53     if (tot!=k) {cout<<-1; return 0;}
54     cout<<n<<endl;
55     for (llg i=2;i<=n;i++) printf("%d %d\n",dad[i],i);
56     return 0;
57 }

 

转载于:https://www.cnblogs.com/Dragon-Light/p/6586742.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型验证组件 FluentValidation

FluentValidation 是 .NET 下的模型验证组件&#xff0c;和 ASP.NET MVC 基于Attribute 声明式验证的不同处&#xff0c;其利用表达式语法链式编程&#xff0c;使得验证组件与实体分开。正如 FluentValidation 的 介绍&#xff1a; A small validation library for .NET that u…

第二届中国PWA开发者日

点击蓝字关注我们活动介绍为加速推动渐进式 Web 应用 (PWA) 在中国的发展&#xff0c;微软与英特尔携手举办“第二届中国 PWA 开发者日”。本次活动邀请一众业界大咖围绕 PWA 展开分享&#xff0c;探讨最新技术进展&#xff0c;及 PWA 生态的实践与落地。期待与您线上相聚。活动…

【GlobalMapper精品教程】018:提取影像数据的范围生成矢量图层

文章目录 1. 加载影像数据2. 生成边界3. 导出矢量范围4. 背景影响边界解决办法1. 加载影像数据 以DSM为例,加载如下所示: 2. 生成边界 在影像图层上右键→图层→【边界框/覆盖-创建图层覆盖框/多边形区要素】,如下图所示: 选择【否】。 边界创建完成。 3. 导出矢量范围 …

MPMoviePlayerController属性方法简介

属性说明property (nonatomic, copy) NSURL *contentURL播放媒体URL&#xff0c;这个URL可以是本地路径&#xff0c;也可以是网络路径property (nonatomic, readonly) UIView *view播放器视图&#xff0c;如果要显示视频必须将此视图添加到控制器视图中property (nonatomic, re…

在Leangoo里怎么设置看板周期?

设置看板周期有两种方式&#xff1a; 1&#xff09;点击看板上的看板周期时间直接修改 2&#xff09;通过菜单 设置看板周期 浏览器访问官网链接&#xff1a;www.leangoo.com 转载于:https://www.cnblogs.com/shineshine/p/5663104.html

consul部署多节点和consul-template部署

一.consul的介绍 1.1consul是什么&#xff1f; Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。 Consul是分布式的、高可用的、可横向扩展的。它具备以下特性 : service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外…

基于ABP实现DDD

什么是DDD呢&#xff1f;领域驱动设计[DDD]是一种针对复杂需求的软件开发方法。将软件实现与不断发展的模型联系起来&#xff0c;专注于核心领域逻辑&#xff0c;而不是基础设施细节。DDD适用于复杂领域和大规模应用&#xff0c;而不是简单的CRUD应用。它有助于建立一个灵活、模…

二、通过工厂方法来配置bean

调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节. 要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法…

【GlobalMapper精品教程】019:基于DSM提取离散随机点的高程信息

本文讲解在globalmapper中,基于DSM提取离散随机点的高程信息,配套数据为data019.rar。 文章目录 1. 离散点创建2. 提取离散点高程信息3. 高程标注1. 离散点创建 本文在ArcGIS中,根据给定的范围,随机生成离散点,如下图: 拓展阅读: ArcGIS根据范围创建随机点教程:【ArcG…

shell脚本注意点

2019独角兽企业重金招聘Python工程师标准>>> 直接命令行写脚本的时候&#xff0c;可以用 ; 分割&#xff0c;或 也可以直接回车&#xff0c;然后在继续写脚本在使用 方括号[ ] 的时候&#xff0c;里面空格两边都必须要有空格&#xff0c;比如 [ $a -gt 3 ] 在方括号…

C语言编程规范--------2 注释

2.1 注释的原则 注释的目的是解释代码的目的、功能和采用的方法&#xff0c;提供代码以外的信息&#xff0c;帮助读者理解代码&#xff0c;防止没必要的重复注释信息。 示例&#xff1a;如下注释意义不大。 /* if receive_flag is TRUE */ if (receive_flag) 而如下的注释则给出…

备战金九银十:RabbitMQ有5种工作模式(6)

RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客…

【GlobalMapper精品教程】020:Lidar点云数据分类(自动分类、手动分类)案例详解

航测点云通常跟DSM一致,即包含植被、房屋等信息,必须进行点云分类、过滤,才能生成准确的高程点、等高线和DEM等地形数据。本文以案例的形式详细讲解globalmapper23中点云工具及使用方法。 文章目录 1. 点云分类2. 创建地面高程格网3. 地形绘制4. 格网转点云5. 点云抽稀6. 点…

社交网络图中结点的“重要性“计算(Dijkstra + SPFA + Floyd + 模板)

题目链接&#xff1a; 无 题目大意&#xff1a; 求一个点到其他所有点的最短距离和&#xff0c;保证图连通。 解题过程&#xff1a; 刚开始用 Floyd 水过的&#xff0c;后来用换了几种方法&#xff0c;不错的模板题&#xff0c;Floyd 的时候&#xff0c;要用 vector 存边&#…

web布局固定宽度+变化宽度实现思路

前言 页面当中常规布局我想大家都会的&#xff0c;但有些布局是常规布局中实现不了的&#xff0c;比如变宽和固宽结合的&#xff0c;需要实现(300px)&#xff0b;(100%&#xff0d;300px)的两列布局。以下样式代码前提均为盒模型为border-sizing 的前提下。 html部分 <div c…

CSS3 nth 伪类选择器

考察下面的 HTML 代码片段&#xff1a; <div><section>section 1</section><section>section 2</section><ul><li>item 1</li><li><ul><li>sub item 1</li><li>sub item 2</li><li>…

RedisCluster的安装、部署、扩容和 Java客户端调用

Redis下载 官网地址&#xff1a;http://redis.io/ 中文官网地址&#xff1a;http://www.redis.cn/ 下载地址&#xff1a;http://download.redis.io/releases/ 安装 # &#xff08;三台&#xff09;安装 C 语言需要的 GCC 环境 yum install -y gcc-c yum install -y wget # 下…

【CloudCompare教程】001:CloudCompare中文版下载与安装图文教程

CloudCompare是一款功能强大的点云后处理软件,本文讲解CloudCompare中文版下载与安装方法。 文章目录 一、CloudCompare下载地址二、CloudCompare安装教程三、CloudCompare中文设置一、CloudCompare下载地址 官方下载地址:http://www.danielgm.net/cc/release/ 二、CloudComp…

ML.NET相关资源整理

在人工智能领域&#xff0c;无论是机器学习&#xff0c;还是深度学习等&#xff0c;Python编程语言都是绝对的主流&#xff0c;尽管底层都是C实现的&#xff0c;似乎人工智能和C#/F#编程语言没什么关系。在人工智能的工程实现&#xff0c;通常都是将Python训练好的人工智能模型…