[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:

  1. Take any integer xi and multiply it by two, i.e. replace xi with 2·xi.
  2. 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的更多相关文章

  1. Codeforces 722D. Generating Sets

    D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. CF722D. Generating Sets[贪心 STL]

    D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. 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 ...

  4. Generating Sets 贪心

    H - Generating Sets Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64 ...

  5. 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 ...

  6. D. Generating Sets 解析(思維)

    Codeforce 722 D. Generating Sets 解析(思維) 今天我們來看看CF722D 題目連結 題目 略,請直接看原題 前言 真的是沒想到... @copyright petje ...

  7. codeforces 722D Generating Sets 【优先队列】

    You are given a set Y of n distinct positive integers y1, y2, ..., yn. Set X of n distinct positive ...

  8. 【53.57%】【codeforces 722D】Generating Sets

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  9. 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 ...

随机推荐

  1. HDU 1221 Rectangle and Circle 考虑很多情况,good题

    http://acm.hdu.edu.cn/showproblem.php?pid=1221 114 92 31 95 13 96 3 这题只需要判断圆和矩形是否相交,然后在里面是不算相交的. 那么就 ...

  2. 动手实现 Redux(三):纯函数(Pure Function)简介

    我们接下来会继续优化我们的 createStore 的模式,让它使我们的应用程序获得更好的性能. 但在开始之前,我们先用一节的课程来介绍一下一个函数式编程里面非常重要的概念 —— 纯函数(Pure F ...

  3. DMA简介

    直接存储器访问 直接存储器访问(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术.它可以让外设可以独立地直接读写系统存储器,而不需绕道中央处理器(CPU),DMA是一 ...

  4. 无法登录phpmyadmin,报1130错误

    分析过程及解决方案: mysql的1130错误是远程连接的用户无远程权限问题导致.解决方案:在本机登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”loc ...

  5. JS通过使用PDFJS实现基于文件流的预览功能

    需求: 使用JS实现PDF文件预览功能 备选方案: 使用ViewerJS,官网  http://viewerjs.org/ 使用PDFJS,官网  https://mozilla.github.io/ ...

  6. 洛谷 P3038 [USACO11DEC]牧草种植Grass Planting

    题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional road ...

  7. Docker 启动时报错:iptables:No chain/target/match by the name

    重新启动docker后,就好了. service docker restart

  8. 运行外部exe

    bool CFileOperate::lauchCAD() { //启动ZWCAD CString OutputPath; STARTUPINFO si; //一些必备参数设置 memset(& ...

  9. integer to roman leetcode c++实现

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...

  10. PHP20 PHP面向对象辅助

    学习要点 常用函数 命名空间 类的自动加载 常用函数 class_exists 作用:检查类是否已定义 语法格式: bool class_exists ( string $class_name [, ...