【Baltic2014】【BZOJ3917】Sequence

原创 2016年05月04日 07:31:08

Description

序列A由从N开始的连续K个数按顺序构成,现在将A中的每个数只保留某一个数码,记为序列B,给定K和B,求可能的最小的N
Input

第一行一个数K,第二行K个数B_i
Output

输出一个数N
Sample Input

6

7 8 9 5 1 2
Sample Output

47
HINT

K<=100000,0<=B_i<=9

N是正整数

Source

APIO强行给此题打广告啊….
此题智商题,我确实不会做
提供一份英文版的官方题解,自己看吧

We’ll solve our task by solving a more complex task first: for each i-th sequence element we’ll declare sequence A_i.
A_i is the sequence of digits which i-th sequence element has to have.
For our initial task, A_i = {d_i}, where d_i - …

Lets donate N = (X)y, where y = N mod 10 is the last digit and X = N div 10.
Now we have to try all possible y values (0, 1, …, 9).
After we have locked y value with one of possible values, our sequence looks like this: (X)y, (X)y+1, …, (X)8, (X)9, (X+1)0, (X+1)1 …, (X+1)8, (X+1)9, (X+2)0, …
After removing last digit, we get sequence X, …, X, X+1, …, X+1, X+2, …

What digits does X has to have?
(X)y has A_1, so X must have A_1 \ {y}. (X)(y+1) has A_2, so X must have A_2 \ {y+1} and so on.

By merging these requirements, we can get a new sequence of sets B_1, B_2, …
B_1 declares required digits for X, B_2 - for (X+1) and so on.
We repeat the same steps with our new sequence.
What happens when we repeat these steps?
We started with sequence length K, so after first step our new sequence length will be not bigger than [K/10]+1.
So after log K steps our sequence will be of length 1 or 2 - at this step we can produce the answer.

Time complexity: O(K*log K)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 100010
#define LL long long
#define GET (ch>='0'&&ch<='9')
using namespace std;
int k,b[MAXN];
template <class classname>
inline void in(classname &x)
{
    char ch=getchar();x=0;
    while (!GET)    ch=getchar();
    while (GET) x=x*10+ch-'0',ch=getchar();
}
LL solve(const int a[],int n,bool fla)
{
    LL ret=1ll<<62;
    if (n==1)
    {
        ret=0;
        for (int i=1;i<=9;++i)
            if (a[1]&(1<<i))
            {
                ret=ret*10+i;
                if (ret==i&&(a[1]&1))   ret*=10;
            }
        if (ret==0&&(a[1]&1))   ret=10;
        return ret;
    }
    int tn[MAXN],tp=0;
    for (int i=0;i<9+fla;++i)
    {
        int num=0,now=i;tp=0;bool b=0;
        for (int j=1;j<=n;++j)
        {
            num|=a[j]&(1023-(1<<now));
            if ((a[j]&1)&&now==0)   b=1;
            now++;now=now>=10?now-10:now;
            if (!now||j==n) tn[++tp]=num,num=0;
        }
        LL ans=solve(tn,tp,i<9||n>2)*10+i;
        if (!ans&&b)    ans=10;
        ret=min(ret,ans);
    }
    return ret;
}
int main()
{
    in(k);
    for (int i=1;i<=k;i++)  in(b[i]),b[i]=1<<b[i];
    cout<<solve(b,k,1)<<endl;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

bzoj3917【Baltic2014】sequence

枚举法
  • AaronGZK
  • AaronGZK
  • 2016年05月11日 00:25
  • 2403

bzoj3917 && apio2016练习赛T2 题解

CA那里有没有翻译的,本弱菜秉承着看不懂英文的原则翻译了一下(渣翻勿喷 解决我们的这个任务,需要先解决一个更复杂的问题:我们对序列的第i个元素我们声明一个元素Ai Ai是第i位元素必须含有的数位 ...
  • lcrtest
  • lcrtest
  • 2016年05月04日 10:43
  • 1071

[暴力] BZOJ 3917 [Baltic2014]sequence

学习波罗的海小哥的做法,复杂度好虚:http://www.boi2014.lmio.lt/tasks.html 据说是KlogK的  还有O(K)的做法 #include #include #in...
  • u014609452
  • u014609452
  • 2016年05月04日 21:29
  • 711

bzoj 1367: [Baltic2004]sequence(中位数+可并堆)

1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 935  Solved: 351 [Submit]...
  • clover_hxy
  • clover_hxy
  • 2016年05月08日 17:16
  • 831

bzoj1367 [Baltic2004]sequence

左偏树论文模板题,不过想法很好。。 把序列分成m个区间,答案就是m个区间的中位数,中位数的维护,我们每次只维护当前区间前一半的最大堆,然后如果超过一半就弹出,堆顶就是中位数。#include #in...
  • qq_35866453
  • qq_35866453
  • 2017年04月18日 09:44
  • 200

Oracle中sequence的使用方法

在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方。   1、Create Sequence   (注释:你需...
  • h183288132
  • h183288132
  • 2015年04月14日 13:21
  • 1423

sequence的用法

sequence是一个特殊的存放等差数列的表,其受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下一条记录应该是多少,这个表没有实际意义,常常用来做主键用。 在inf...
  • zzuchenyb
  • zzuchenyb
  • 2014年05月09日 10:18
  • 1256

oracle sequence的概念及作用

sequence概念及作用sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字,它可用于自动生成主键值,并能协调多行或者多表的主键操 作。没有sequence,顺序的值...
  • ghgzczxcvxv
  • ghgzczxcvxv
  • 2016年05月26日 16:56
  • 2001

数据库sequence的作用和用法

水平有限,欢迎交流,转载注明出处!!!
  • u013187074
  • u013187074
  • 2016年10月14日 19:51
  • 3340

Oracle Sequence Cache 参数说明【转自dave偶像大神】

原文链接:http://blog.csdn.net/tianlesoftware/article/details/5995051 一. 理论知识 先看一个创建Sequence的语句: S...
  • lovedieya
  • lovedieya
  • 2014年02月27日 02:00
  • 1197
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Baltic2014】【BZOJ3917】Sequence
举报原因:
原因补充:

(最多只允许输入30个字)