【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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CreationAugust/article/details/51311798

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:14
  • 929

BZOJ3917 [Baltic2014]sequence

这题好神-_- 我们考虑对序列里的每一个数a[i],求一个集合s[i],代表a[i]中必须出现的数字集合 初始的时候每个s[i]里都只有输入的那个数 我们另x[i]=a[i]/10(整除)y[i...
  • neither_nor
  • neither_nor
  • 2016-09-21 10:08:47
  • 448

bzoj3917【Baltic2014】sequence

枚举法
  • AaronGZK
  • AaronGZK
  • 2016-05-11 00:25:30
  • 2466

[bzoj3992][SDOI2015]序列统计

题目描述小C有一个集合S,里面的元素都是小于M的非负整数。他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S。 小C用这个生成器生成了许多这样的数列。但是小C有一个...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2015-12-29 18:51:50
  • 769

【Baltic 2004】数字序列(有改动)

原题在BZOJ上的链接 题目描述 题意:给你一个长度为n的整数序列A。把它变成一个不降的序列。求改动的最小代价,代价为更改前后的数字大小的差值。 就是没有了原题中改动次数最小的限制。 ...
  • element_hero
  • element_hero
  • 2018-02-22 19:36:59
  • 45

【Baltic2014】【BZOJ3917】Sequence

Description序列A由从N开始的连续K个数按顺序构成,现在将A中的每个数只保留某一个数码,记为序列B,给定K和B,求可能的最小的N Input第一行一个数K,第二行K个数B_i Outpu...
  • CreationAugust
  • CreationAugust
  • 2016-05-04 07:31:08
  • 1292

[暴力] BZOJ 3917 [Baltic2014]sequence

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

[Baltic2014]sequence 解题报告

想了很久还是不会。。然后开始各种乱搞全都不行。。 最后看了题解感觉好厉害!首先我们将问题放缩。设x的每一位的数字集合是S(x),则对于给定数列{Bi}(i∈[0,k))\{ B_i \}(i \in...
  • TA201314
  • TA201314
  • 2016-05-11 10:42:20
  • 2184

[CODEVS1060]搞笑世界杯 解题报告

这道题其实真的挺简单的。。但一开始想复杂了,导致很久才做出来。 我的思路是这样的: 设f(i,j)为前i个人拿到j张票的概率,则有: #include using namespace...
  • TA201314
  • TA201314
  • 2014-12-14 23:15:10
  • 1010
收藏助手
不良信息举报
您举报文章:【Baltic2014】【BZOJ3917】Sequence
举报原因:
原因补充:

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