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 ...
随机推荐
- Git与GitHub入门
一.git起步https://www.runoob.com/git/git-install-setup.html1.下载git(Windows)2.安装GUI(TortoiseGit)3.查看git配 ...
- 『言善信』Fiddler工具 — 13、Fiddler断点功能的使用详解
目录 1.Fiddler断点的应用 2.断点的分类 3.设置全局断点 (1)设置before Requests全局断点: (2)设置After Responses全局断点: 4.设置局部断点 (1)设 ...
- 【NX二次开发】Block UI 指定位置
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- 单元测试布道二:在全新的 DDD 架构上进行单元测试
目录 回顾 dotnet 单元测试相关的工具和知识 可测试性 不确定性/未决行为 依赖于实现:不可 mock 复杂继承/高耦合代码:测试困难 实战:在全新的 DDD 架构上进行单元测试 需求-迭代1: ...
- Oracle数据泵导出数据库
Oracle数据泵导出数据库 特别注意:如果后续要导入的数据库版本低,所有导出命令就需要在后面加一个version=指定版本. 例如从11g导出数据导入到10g,假设10g具体版本为10.2.0.1, ...
- R语言读取文件
1.R语言读取文件,文件类型为.txt 直接使用read.table()即可,若不知道当前的工作目录,可以使用函数getwd()来查看 2.R语言读取文件,文件类型为.xlsx 方法一:可以把excl ...
- 02 jumpserver系统设置
2.系统设置: (1)基本设置: (2)邮件设置: 1)163邮箱设置: 2)在jumpserver上填写邮箱信息: 3)邮件测试信息如下: (3)邮件内容设置: (4)终端设置: (5)安全设置:
- Linux + .net core 开发升讯威在线客服系统:同时支持 SQL Server 和 MySQL 的实现方法
前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程. 有很多朋友一直提出希望能够支持 MySQL 数据库,考虑到已经有朋友在用 SQL Server,我在升级的过程中 ...
- DRF之过滤排序分页异常处理
一.过滤 对于列表数据要通过字段来进行过滤,就需要添加 django-filter 模块 使用方法: # 1.注册,在app中注册 settings.py INSTALLED_APPS = [ 'dj ...
- 在ubuntu16下编译openJDK11
为什么需要编译自己的jvm源码? 想象下, 你想看看java线程是如何start的? 去源码里一找 native void start0(), 此时如果你对jvm源码比较熟悉, 那么可以下载openJ ...