1 条题解

  • 0
    @ 2026-5-7 0:29:06

    题目分析

    超绝神秘 Ad-hoc 题啊。

    首先我们注意到一个东西:一个数可以增长的飞快,但是很难恰好的控制为一个精确的数。

    我们的目的是找到一种方法来精确的凑数,问题比较大的瓶颈是每次加的都是上一个数,没法进行单点修改操作。

    我们考虑一种别样的方式:先设置成一个数,然后再覆盖掉。这样可以加法,但是这又有一个问题:这个数会被重复贡献。

    既然如此,那就设置成一个特殊的数吧,我们可以轻松全部设置为 11。同时我们此时发现了重要性质,我们可以随便搞 22,这使我们想到了每次减半的递归,奇偶数分别用 1,21,2 递归即可。

    总次数是 3×logn+100<3003\times \log n+100<300

    代码

    #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

    「UOI 2023 Stage 4 Day2」数组与再次加法

    信息

    ID
    10970
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者