답안 #983504

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
983504 2024-05-15T15:18:51 Z Faisal_Saqib 순열 (APIO22_perm) C++17
97 / 100
739 ms 700 KB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define vll vector<int>
vector<int> cp(ll k)// O(lg n)
{
    vector<int> ans;
    ll n_req=0;
    ll hb=-1;
    for(int j=59;j>=0;j--)
    {
        ll pw=(1ll<<j);
        if(k&pw)
        {
            if(hb==-1)
            {
                n_req+=j;
                hb=j;
            }
            else
                n_req++;
        }
    }
    ll last=n_req-1;
    int first=0;
    // cout<<last<<endl;
    for(int l=0;l<60 and l<hb;l++)
    {
        if(k&(1ll<<l))
        {
            ans.push_back(first);
            first++;
        }
        if(first<=last)
        {
            ans.push_back(last);
            last--;
        }
    }
    reverse(begin(ans),end(ans));
    return ans;
}
ll task(ll n) // O(lg n)
{
    ll cp=0;
    for(int bit=59;bit>=0;bit--)
    {
        if(n&(1ll<<bit))
        {
            cp+=bit;
            n^=(1ll<<bit);
            break;
        }
    }
    while(n)
    {
        cp++;
        n-=(n&-n);
    }
    return cp;
}
vector<int> construct_permutation(ll k)
{
    // vector<int> ans=cp(k);
    ll mx=task(k);
    ll a=-1;
    ll b=k;
    // if(mx<90)
    // {
    //     return ans;
    // }
    ll SQ=7e5;
    for(ll d=1;d<=SQ;d++)
    {
        if(k%d==0)
        {
            ll f=task(d);
            ll s=task(k/d);
            if((f+s)<mx)
            {
                mx=f+s;
                a=d;
                b=k/d;
            }
        }
    }
    if(a==-1)
    {
        return cp(k);
    }
    else{
        vll ap=cp(a);
        vll bp=cp(b);
        ll nm=ap.size();
        for(auto i:bp)
            ap.pb(i+nm);
        return ap;
    }
    return {};
}
// int main()
// {
//     int n;
//     cin>>n;
//    auto tp= construct_permutation(n);
//    for(auto k:tp)
//    {
//     cout<<k<<' ';
//    }
//    cout<<endl;
// }
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 348 KB Output is correct
2 Correct 267 ms 416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 348 KB Output is correct
2 Correct 267 ms 416 KB Output is correct
3 Correct 301 ms 344 KB Output is correct
4 Correct 327 ms 592 KB Output is correct
5 Partially correct 473 ms 600 KB Partially correct
6 Correct 512 ms 596 KB Output is correct
7 Correct 619 ms 700 KB Output is correct
8 Partially correct 724 ms 700 KB Partially correct
9 Correct 739 ms 676 KB Output is correct
10 Partially correct 739 ms 684 KB Partially correct
11 Partially correct 708 ms 460 KB Partially correct
12 Correct 666 ms 664 KB Output is correct
13 Correct 717 ms 440 KB Output is correct