Submission #983273

# Submission time Handle Problem Language Result Execution time Memory
983273 2024-05-15T09:53:08 Z Faisal_Saqib Permutation (APIO22_perm) C++17
97 / 100
904 ms 684 KB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define vll vector<ll>
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=ans.size();
    if(mx<95)
    {
        return ans;
    }
    ll SQ=1e6;
    SQ=min(SQ,k);
    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;
                vector<int> f_=cp(d);
                vector<int> s_=cp(k/d);
                ll nm=s_.size();
                for(int i=0;i<f_.size();i++)
                    f_[i]+=nm;
                ans.clear();
                for(auto i:s_)
                    ans.pb(i);
                for(auto i:f_)
                    ans.pb(i);
            }
        }
    }
    return ans;
}
// int main()
// {
//     int n;
//     cin>>n;
//    auto tp= construct_permutation(n);
//    for(auto k:tp)
//    {
//     cout<<k<<' ';
//    }
//    cout<<endl;
// }

Compilation message

perm.cpp: In function 'std::vector<int> construct_permutation(long long int)':
perm.cpp:85:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   85 |                 for(int i=0;i<f_.size();i++)
      |                             ~^~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Partially correct 174 ms 348 KB Partially correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Partially correct 43 ms 472 KB Partially correct
9 Correct 1 ms 348 KB Output is correct
10 Partially correct 904 ms 680 KB Partially correct
11 Partially correct 12 ms 348 KB Partially correct
12 Partially correct 1 ms 600 KB Partially correct
13 Partially correct 236 ms 684 KB Partially correct