【题解】AGC012C Tautonym Puzzle(人类智慧)

【题解】AGC012C Tautonym Puzzle(人类智慧)

一个naive的想法是,先放len个\(a\),此时有\(2^{len}-1\)的贡献,然后递归到子问题,这个很遗憾是过不了的(I开头的神仙:但是我可以过)

但是这个启示我们一件事情,我们想办法利用二进制倍增来弄。

考虑增量构造,我们把这个序列分为前后两半部分,每次我可以选择插入两个相同的之前没有的数一个在最后面一个在:

  • 在中间,答案乘2
  • 在两边,答案减一

然后直接快速幂搞搞

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<deque>

using namespace std;  typedef long long ll;

int main(){
	ll n;
	deque<int> ans;
	cin>>n; ++n;
	while(n)
		if(n&1) n>>=1,ans.push_back(ans.size()+1);
		else --n,ans.push_front(ans.size()+1);
	cout<<(ans.size()<<1)<<endl;
	for(auto t:ans) cout<<t<<' ';
	for(int t=1;t<=(int)ans.size();++t) cout<<t<<' ';
	cout<<endl;
	return 0;
}

posted @ 2020-05-28 20:20  谁是鸽王  阅读(188)  评论(0编辑  收藏  举报