Codeforces Round #386 (Div. 2) C D E G
一场比较简单的题 比较脑洞
C 如果坐车比较快的话 先走不如等车 所以最后的ans是min(纯走路,纯坐车) 讨论一下坐车时间
D 因为k一定是>=1的 所以当a=b的时候 GBGBGB这样间隔放一定可以 想到a>b和b>a都是不太和谐的 应该尽力趋向于a=b 所以一开始使a>b 然后采取放x*a + 1*b的方式 蛮忙放下去 直到a=b
E 可以想到 多出来的数一定要被换掉 所以不需要计入一开始的奇数和偶数总量 先处理出来可以被换的m个数 因为m可能很大 所以取一个min(500050,m) 5*10^5是一定够用的
所以一开始多出来的数 要向促进奇偶平衡的方向去换 如果违逆了这种平衡(当奇数大于偶数的时候 把多余的数去换奇数) 未来可能会出现多换几次的可能 因为除去这些多余的数 有效的奇数和偶数的个数都已经确定 如果无效数的交换不能使平衡出现 就要继续换原本有效的数字来平衡 所以无效数的交换必须致力于平衡
如果无效数字没有可以换的数字(奇数>偶数的时候没有偶数来换了) 这时候其实是一定-1的
处理完无效数字 处理有效数字的时候也要这样来换 如果也出现了没有数字可以换的情况 就是-1
G 把这棵树以1为根转化为有根树 每一层的个数就是a[i] 并且最终有t层 有k个孤独城市 即有k个叶子节点
我们先在每一层拿一个点 连出一条主链来 接下来我们可以算出 在这个图中 叶子节点最多和最少有多少个
最多 即 现在没有连到树中的点的个数之和 还有当前在主链底端的点
最少 即 没有办法分配给一个下一层的儿子节点的点的个数 如果要尽量分配的话 仍然会有a[i]-a[i+1]个点不会被分到下一个点 而它只能连a[i-1]的点 所以孤独
如果k处于最多最少之间 问题有解
可以看到 如果要达到maxx 所有的点都连到上一层的主链上去即可 如果一个点不想做叶子节点 需要把 位于这个点正下方的点 使其不连主链 而是直接接上面的点
能满足条件的点 一共有maxx-minn个 而我们只需要选择maxx-k个进行这种操作就可以了 其余的点连接主链
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<vector>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
using namespace std;
#define L long long
int n , t , m ;
int a[200050] ;
vector<int >r[200050] ;
vector<int >q[200050] ;
int main(){
scanf("%d%d%d",&n,&t,&m) ;
for(int i=1;i<=t;i++)scanf("%d",&a[i]);
int tot=1;
r[0].push_back(1);
for(int i=1;i<=t;i++){
for(int j=0;j<a[i];j++){
tot++;
r[i].push_back(tot);
}
}
q[1].push_back(2);
for(int i=1;i<t;i++){
q[r[i][0]].push_back(r[i+1][0]);
}
int minn=1;
int maxx=1;
a[t+1]=1;
for(int i=1;i<=t;i++){
maxx+=(a[i]-1);
minn+=(max(a[i]-a[i+1],0));
}
if(m<minn||m>maxx){
printf("-1\n");
return 0;
}
m=maxx-m;
for(int i=1;i<=t;i++){
for(int j=1;j<r[i].size();j++){
int k=j+1;
if(k>a[i-1]){
q[r[i-1][0]].push_back(r[i][j]);
}
else {
if(m>0){
m--;
q[r[i-1][j]].push_back(r[i][j]);
}
else {
q[r[i-1][0]].push_back(r[i][j]);
}
}
}
}
printf("%d\n",n);
for(int i=1;i<=n;i++){
for(int j=0;j<q[i].size();j++){
printf("%d %d\n",i,q[i][j]);
}
}
}
一场没有算法的比赛...
Codeforces Round #386 (Div. 2) C D E G的更多相关文章
- Codeforces Round #386 (Div. 2)
迟到的一次比赛 最近状态很崩溃 网速很慢 然后前面五题看了都有打 但是 只有A B E 是过了的 是时候要反省一下 A.随便判断一下就好 最少的份数嘛 B.画出来之后是一下子左边一下子右边 打一个递归 ...
- Codeforces Round #386 (Div. 2) C. Tram
C. Tram time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces Round #386 (Div. 2) 746F(set的运用)
题目大意 给出一个歌单(有n首歌),每个歌都有愉悦值和时间,你可以选择从第x首歌开始听(也就是选择连续的一段),并且你可以选择w首歌让它的时间减半,限制时间为k,求最大的愉悦值 首先我们需要贪心一下, ...
- Codeforces Round #386 (Div. 2) 746G(树的构造)
大体题意 一棵树有n个结点,告诉你每层深度上有a[i]个结点,以及有多少叶子结点 让你生成这棵树 题解:考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那么答案很简单,就是对(a[ ...
- Codeforces Round #386 (Div. 2) A+B+C+D!
A. Compote 水题(数据范围小都是水题),按照比例找最小的就行了,3min水过. int main() { int a,b,c; while(~scanf("%d%d%d" ...
- Codeforces Round #386 (Div. 2)G. New Roads [构造][树]
题目链接:G. New Roads 题意:给出n个结点,t层深度,每层有a[i]个结点,总共有k个叶子结点,构造一棵树. 分析: 考虑一颗树,如果满足每层深度上有a[i]结点,最多能有多少叶子结点 那 ...
- 模拟 Codeforces Round #249 (Div. 2) C. Cardiogram
题目地址:http://codeforces.com/contest/435/problem/C /* 题意:给一组公式,一组数据,计算得到一系列的坐标点,画出折线图:) 模拟题:蛮恶心的,不过也简单 ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
随机推荐
- 【discuz】G变量注解之 $_G['member'] 全局当前登录者信息
print? <?php G变量的使用方法: 直接复制下面的变量放到discuzx模板需要的位置即可! 例如:$_G['style'][boardlogo] 刷新后就会 显示一张logo 全局当 ...
- chm文件无法阅读
当我们费劲千辛万苦从网上下载好chm文件资料后,打开后发现竟然是这个样子的: 其中主要原因是CHM文件被阻止显示了,CHM文件在NTFS格式的硬盘里的时候就会被阻止显示.我们返回我的电脑,点中我们存放 ...
- 【BZOJ2150】部落战争 最小流
[BZOJ2150]部落战争 Description lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇, ...
- eclipse下设置tomcat,修改Java代码不必重启tomcat
1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一般修改 ...
- 华盟网公开课 office 宏 主讲Alex
powershell github: veil-evasion macroshop unicorn https://github.com/trustedsec/unicorn metasploit ...
- CAP theorem
https://en.wikipedia.org/wiki/CAP_theorem
- C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法(gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People's Republic of China.936或者65001.)
转自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/ [在此向原文作者说声谢谢!若有读者看到文章转载时请写该转载地址 ...
- Wireshark网络分析工具(二)
一.TCP三次握手过称 1. 第一次握手的数据包 客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接. 如下图: 2. 第二次握手的数据包 服务器发回确认包, 标志位为 SYN ...
- 0x02 MySQL SQL基本语句
有了mysql这个数据库软件,就可以将程序员从对数据的管理中解脱出来,专注于对程序逻辑的编写 mysql服务端软件即mysqld帮我们管理好文件夹以及文件,前提是作为使用者的我们,需要下载mysql的 ...
- MySQL第一天
数据库课程体系 在PHP阶段,将数据库分为三个阶段: 基础阶段(就业班第一个阶段): 6天, mysql数据库的基本操作(增删改查), 以及一些高级操作(视图, 触发器,函数,存储过程等), ...