1 条题解
-
0
题目分析
超绝神秘 Ad-hoc 题啊。
首先我们注意到一个东西:一个数可以增长的飞快,但是很难恰好的控制为一个精确的数。
我们的目的是找到一种方法来精确的凑数,问题比较大的瓶颈是每次加的都是上一个数,没法进行单点修改操作。
我们考虑一种别样的方式:先设置成一个数,然后再覆盖掉。这样可以加法,但是这又有一个问题:这个数会被重复贡献。
既然如此,那就设置成一个特殊的数吧,我们可以轻松全部设置为 。同时我们此时发现了重要性质,我们可以随便搞 ,这使我们想到了每次减半的递归,奇偶数分别用 递归即可。
总次数是 。
代码
#include<bits/stdc++.h> #define int long long using namespace std; int T,n,id; vector<int>ans; void full_one(){ for(int i=99;i>=1;i--) ans.push_back(i); return; } void solve(int n,int pos){ // cout<<n<<' '<<pos<<endl; if(n==1) return; if(n==2){ ans.push_back(pos); return; } if(n&1){ solve(n/2,pos+1); ans.push_back(pos),ans.push_back(pos); } else{ ans.push_back(pos); solve((n/2)-1,pos+1); ans.push_back(pos),ans.push_back(pos); } return; } void Main(){ ans.clear(); cin>>n; full_one(); solve(n,1); cout<<ans.size()<<'\n'; for(auto v:ans) cout<<v<<' '; cout<<'\n'; return; } signed main(){ for(cin>>T>>id;T;--T) Main(); return 0; }
- 1
信息
- ID
- 10970
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者