CF1214E Petya and Construction Set题解
原来这就叫构造题,了
这道题的做法,我自己诌了一个形象的名字——“挂葡萄”法(
首先,“搭葡萄架”:考虑到每个距离 \(d_i\) 只与 \(2i-1,2i\) 有关,\(2i-1\) 与 \(2(i+1)-1\) 之间的距离是可以随意设置的,那不妨把所有的奇数编号串成一条链(不过注意,链上的编号不一定是按顺序的,因为要顺应题目要求的距离)。
然后,“挂葡萄”:将 \(d\) 数组降序排序,对于每个 \(d_i\),将其按照距离挂在 \(i+d_i-1\) 下面,如果 \(i+d_i-1\) 是链上最后一个或超过了最后一个,则需要把链长度 \(+1\)。
正确性?不显然吗(真的挺显然的⑧……
具体看代码:
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int N=1e6+3;
struct Node{int val,id;}d[N];
vector<int> G[N];
int t[N],n,tot;
bool cmp(Node a,Node b) {return a.val>b.val;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&d[i].val),d[i].id=i;
sort(d+1,d+n+1,cmp);
for(int i=1;i<=n;++i) t[i]=d[i].id*2-1; //搭架子
int tot=n;
for(int i=1;i<=n;++i)
{
if(i+d[i].val-1>=tot) t[++tot]=t[i]+1; //如果不行就要往后延
else G[t[i+d[i].val-1]].push_back(t[i]+1); //挂葡萄
}
for(int i=1;i<=tot;++i)
{
if(i<tot) printf("%d %d\n",t[i],t[i+1]);
for(int j=0;j<G[t[i]].size();++j)
printf("%d %d\n",t[i],G[t[i]][j]);
}
return 0;
}
CF1214E Petya and Construction Set题解的更多相关文章
- Petya and Construction Set(图的构造) Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)
题意:https://codeforc.es/contest/1214/problem/E 有2n个点,每个2*i和2*i-1的距离必须是Di(<=n),现在让你构造这个树. 思路: 因为Di小 ...
- [CF959D]Mahmoud and Ehab and another array construction task题解
解法 非常暴力的模拟. 一开始吧\(1 -> 2 \times 10^6\)全部扔进一个set里,如果之前取得数都是与原数组相同的,那么lower_bound一下找到set中大于等于它的数,否则 ...
- Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)
传送门 A. Optimal Currency Exchange 枚举一下就行了. Code #include <bits/stdc++.h> using namespace std; t ...
- 【题解】P3599 Koishi Loves Construction
[题解]P3599 Koishi Loves Construction \(\mod n\) 考虑如何构造,发现\(n\)一定在第一位,不然不行.\(n\)一定是偶数或者是\(1\),不然 \(n|\ ...
- 题解-Koishi Loves Construction
题解-Koishi Loves Construction 前缀知识 质数 逆元 暴搜 Koishi Loves Construction 给定 \(X\),\(T\) 组测试数据,每次给一个 \(n\ ...
- poj3352 Road Construction & poj3177 Redundant Paths (边双连通分量)题解
题意:有n个点,m条路,问你最少加几条边,让整个图变成边双连通分量. 思路:缩点后变成一颗树,最少加边 = (度为1的点 + 1)/ 2.3177有重边,如果出现重边,用并查集合并两个端点所在的缩点后 ...
- CF1080A Petya and Origami 题解
Content 小 P 想给 \(n\) 位朋友各发一张邀请函,每张邀请函需要耗费 \(2\) 张红色纸,\(5\) 张绿色纸和 \(8\) 张蓝色纸.商店里面的纸是一堆一堆卖的,每堆里面有 \(k\ ...
- CF111A Petya and Inequiations 题解
Content 请找出一个由 \(n\) 个正整数组成的数列 \(\{a_1,a_2,\dots,a_n\}\),满足以下两种条件: \(\sum\limits_{i=1}^na_i^2\geqsla ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
随机推荐
- 【Android编程实战】源码级免杀_Dex动态加载技术_Metasploit安卓载荷傀儡机代码复现
/文章作者:MG193.7 CNBLOG博客ID:ALDYS4 QQ:3496925334/ 在读者阅读本文章前,建议先阅读笔者之前写的一篇对安卓载荷的分析文章 [逆向&编程实战]Metasp ...
- 【c++】string详解
参考: https://www.cnblogs.com/this-543273659/archive/2011/07/21/2113172.html 感谢博主 我能不用char*就不用,而使用C++ ...
- 为什么switch里的case没有break不行
前言 一个小姐姐拿着一个switch的选择题来问我. 之所以这么笃定地回答这个问题,并不是我知道其中原理,而是之前在一个群里,有人问了同类型的问题,我瞥了一眼记住了答案,所以才依葫芦画瓢. 小姐姐接着 ...
- 机械革命z2安装ubuntu20
为了性能买了个游戏本机械革命z2,但还是想用上linux,身为程序员习惯了linux的开发环境有点离不开.但是之前尝试安装deepin或者linux都失败了,一是N卡条件下安装过程和安装之后的显示有问 ...
- eclipse语言怎么设置为中文
2021-05-30 方法:1.查找语言包下载网址,并复制:2.打开eclipse,点击"help"-"Install New Software"-" ...
- Linux中date的用法
一.命令格式:date [参数]... [+格式]二.命令功能:date 可以用来显示或设定系统的日期与时间.三.命令格式:%H 小时(以00-23来表示). %I 小时(以01-12来表示). %K ...
- Linux中mail的用法
简介:mail命令是命令行的电子邮件发送和接收工具.操作的界面不像elm或pine那么容易使用,但功能非常完整Red Hat上sendmail服务一般是自动启动的.可以通过下面的命令查看sendmai ...
- 详解C++中继承的基本内容
有些类与类之间存在特殊的关系,有共性也有特性,比如动物类可以细分为猫,狗等.下级别的成员除了拥有上一级的共性,还有自己的特性,这个时候就可以考虑继承的技术,减少重复代码. 一.继承中的对象模型 1.1 ...
- 【Azure 应用服务】Azure Function App 执行PowerShell指令[Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt]错误
问题描述 使用PowerShell脚本执行获取Azure订阅列表的指令(Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt).在本地 ...
- Object 中的默认方法
1.public final native Class<?> getClass() getClass方法,返回该实例的java.lang.Class类,例如 Object obj = ne ...