Atcoder Grand 012 C - Tautonym Puzzle

题意:

构造一个字符串,使得这个字符串有只有n个形如AA这样的子序列。

 

神TM构造题不会做,,

我们构造一个长度为2*m的字符串,前m个是一个1-m的排列,后m个就是按顺序1-m。

这样这个串里符合要求的子序列就是1-m排列中的最长上升子序列个数。

定义函数f(x)表示构造一个最长上升子序列个数为x的字符串。

如果$x\%2=1$,$f(x)=[len(f(x-1))+1]+f(x-1)$

如果$x\%2=0$,$f(x)=f(x/2)+[len(f(x/2))+1]$

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
int l[1005],r[1005];
int p1,p2,now;
void solve(ll x)
{
    if(x==1)return ;
    if(x%2==1)l[++p1]=++now,x--;
    r[++p2]=++now;
    solve(x/2);
}
int main()
{
    cin>>n;
    solve(n+1);
    printf("%d\n",now*2);
    for(int i=1;i<=p1;i++)cout<<now-l[i]+1<<' ';
    for(int i=p2;i>=1;i--)cout<<now-r[i]+1<<' ';
    for(int i=1;i<=now;i++)cout<<i<<' ';
    return 0;
}

 

posted @ 2017-10-18 09:17  SD_le  阅读(192)  评论(0编辑  收藏  举报
重置按钮