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;
}