[codeforces722D]Generating Sets
[codeforces722D]Generating Sets
试题描述
You are given a set Y of n distinct positive integers y1, y2, ..., yn.
Set X of n distinct positive integers x1, x2, ..., xn is said to generate set Y if one can transform X to Y by applying some number of the following two operation to integers in X:
- Take any integer xi and multiply it by two, i.e. replace xi with 2·xi.
- Take any integer xi, multiply it by two and add one, i.e. replace xi with 2·xi + 1.
Note that integers in X are not required to be distinct after each operation.
Two sets of distinct integers X and Y are equal if they are equal as sets. In other words, if we write elements of the sets in the array in the increasing order, these arrays would be equal.
Note, that any set of integers (or its permutation) generates itself.
You are given a set Y and have to find a set X that generates Y and the maximum element of X is mininum possible.
输入
The first line of the input contains a single integer n (1 ≤ n ≤ 50 000) — the number of elements in Y.
The second line contains n integers y1, ..., yn (1 ≤ yi ≤ 109), that are guaranteed to be distinct.
输出
Print n integers — set of distinct integers that generate Y and the maximum element of which is minimum possible. If there are several such sets, print any of them.
输入示例
输出示例
数据规模及约定
见“输入”
题解
建一颗二叉的 Trie 树,把每个数转化成二进制并映射到树上,然后每次找到最大的那个数往根节点上跳:一步步向上走,一遇到没有被占用的点就停下来,定居在这里;如果一直到根节点都是被别人占用的点,就说明不可能再把最大值减小了,输出并退出程序即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
return x * f;
} #define maxn 50010
#define maxnode 1600010
#define maxlog 32 int rt, ToT, fa[maxnode], ch[maxnode][2], node[maxn], id2[maxlog];
bool tag[maxnode];
void build(int& o, int v) {
int num[maxlog], cnt = 0;
while(v) num[++cnt] = v & 1, v >>= 1;
// for(int i = cnt; i; i--) putchar(num[i] + '0'); putchar('\n');
if(!o) o = rt;
for(int i = cnt - 1; i; i--) {
int& to = ch[o][num[i]];
if(!to) to = ++ToT, fa[to] = o;
o = to;
}
tag[o] = 1;
return ;
}
int Move(int& o) {
int u = o;
while(fa[u] && tag[u]) u = fa[u];
if(u && !tag[u]) tag[o] = 0, tag[u] = 1, o = u;
int res = 1; u = o;
int num[maxlog], cnt = 0;
while(fa[u]) num[++cnt] = (ch[fa[u]][1] == u), u = fa[u];
for(int i = cnt; i; i--) res = res << 1 | num[i];
return res;
} struct Num {
int v, id;
Num() {}
Num(int _, int __): v(_), id(__) {}
bool operator < (const Num& t) const { return v < t.v; }
} ;
priority_queue <Num> Q;
int ans[maxn], cnta; int main() {
id2[0] = 1;
for(int i = 1; i < maxlog; i++) id2[i] = id2[i-1] << 1;
rt = ToT = 1;
int n = read();
for(int i = 1; i <= n; i++) {
int x = read(); Q.push(Num(x, i));
build(node[i], x);
}
/*for(int i = 1; i <= ToT; i++) printf("%d: %d(%d %d)[%d]\n", i, fa[i], ch[i][0], ch[i][1], tag[i]);
for(int i = 1; i <= n; i++) printf("%d%c", node[i], i < n ? ' ': '\n');*/ while(1) {
Num u = Q.top(); Q.pop();
int tmp = Move(node[u.id]);
// printf("%d -> %d(%d)\n", u.v, tmp, node[u.id]);
Q.push(Num(tmp, u.id));
if(tmp == u.v) break;
} while(!Q.empty()) ans[++cnta] = Q.top().v, Q.pop();
for(int i = 1; i <= cnta; i++) printf("%d%c", ans[i], i < cnta ? ' ' : '\n'); return 0;
}
[codeforces722D]Generating Sets的更多相关文章
- Codeforces 722D. Generating Sets
D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- CF722D. Generating Sets[贪心 STL]
D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets 贪心
D. Generating Sets 题目连接: http://codeforces.com/contest/722/problem/D Description You are given a set ...
- Generating Sets 贪心
H - Generating Sets Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets 贪心+优先队列
D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- D. Generating Sets 解析(思維)
Codeforce 722 D. Generating Sets 解析(思維) 今天我們來看看CF722D 題目連結 題目 略,請直接看原題 前言 真的是沒想到... @copyright petje ...
- codeforces 722D Generating Sets 【优先队列】
You are given a set Y of n distinct positive integers y1, y2, ..., yn. Set X of n distinct positive ...
- 【53.57%】【codeforces 722D】Generating Sets
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A B C D 水 模拟 并查集 优先队列
A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
随机推荐
- 外文翻译 《How we decide》多巴胺的预言 第二节
本节阅读感言:一朝被蛇咬,十年怕井绳.我们的大脑时刻跟新着本体的预测机制. 上一节提到的喇叭,苹果汁实验可以不断的延伸扩展,在播放喇叭前用强光照射...强光照射前放置特定的图片...都可以扩展多巴胺相 ...
- 外文翻译 《How we decide》多巴胺的预言 第一节
这是第二章的起始... 书的导言 1991年2月24日凌晨.第一与第二海军陆战队大批向北进入了沙特阿拉伯的沙漠地带,他们从这来进入科威特.这批军队是伊拉克入侵8个月以来,同盟国第一批进入科威特的部队. ...
- jacob的使用方法
网上一大堆你抄我的,我抄你的,但基本配置都没说清,做个笔记让后来的人少走冤枉路 1.下载最新的jacob,jdk版本一一对应,1.6对应jacob的1.16,1.7对应1.17.... 2.应用程序将 ...
- prevent to do sth 与 prevent sb (from) doing 用法
prevent to do sth 如: Do not water in before making a turn every time 9 days, make wilting of its bra ...
- 看Spring Data如何简化数据操作
Spring Data 概述 Spring Data 用于简化数据库访问,支持NoSQL 和 关系数据存储,其主要目标是使数据库的访问变得方便快捷. SpringData 项目所支持 NoSQL 存储 ...
- dns2tcp使用教程
在2010年6月的更新(也是迄今为止最新的更新)后,其源代码支持编译为Windows平台的可执行程序.而且此工具使用C语言开发编写,不需要TUN/TAP,所以大大加强了它的可用性. 下载 当前最新的0 ...
- k近邻法(kNN)
<统计学习方法>(第二版)第3章 3 分类问题中的k近邻法 k近邻法不具有显式的学习过程. 3.1 算法(k近邻法) 根据给定的距离度量,在训练集\(T\)中找出与\(x\)最邻近的\(k ...
- Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- myBatis.xml文档实例
单个参数:myBatis不会做特殊处理 #{参数名}: 取出参数值 多个参数: myBatis会做特殊处理 多个参数会被封装成一个MAP key:param1 param2.... param10,或 ...
- HTML基础(三)图像和超链接
图像 img 元素向网页中嵌入一幅图像. 语法 <img src="" alt="" /> img标签常用属性 src 跳转的url alt 图片不 ...