Submission #970463

# Submission time Handle Problem Language Result Execution time Memory
970463 2024-04-26T14:56:11 Z steveonalex Permutation (APIO22_perm) C++17
91.3333 / 100
144 ms 604 KB
#include <bits/stdc++.h>
#include "perm.h"
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
 
#define ALL(v) (v).begin(), (v).end()
#define MASK(i) (1LL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
 
// mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rng(1);
ll rngesus(ll l, ll r){return ((ull) rng()) % (r - l + 1) + l;}
 
ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
 
ll LASTBIT(ll mask){return mask & (-mask);}
ll pop_cnt(ll mask){return __builtin_popcountll(mask);}
ll ctz(ll mask){return __builtin_ctzll(mask);}
ll clz(ll mask){return __builtin_clzll(mask);}
ll logOf(ll mask){return 63 - clz(mask);}
 
template <class T1, class T2>
    bool minimize(T1 &a, T2 b){
        if (a > b){a = b; return true;}
        return false;
    }
template <class T1, class T2>
    bool maximize(T1 &a, T2 b){
        if (a < b){a = b; return true;}
        return false;
    }
template <class T>
    void printArr(T& a, string separator = " ", string finish = "\n", ostream& out = cout){
        for(auto i: a) out << i << separator;
        out << finish;
    }
template <class T>
    void remove_dup(vector<T> &a){
        sort(ALL(a));
        a.resize(unique(ALL(a)) - a.begin());
    }

struct FenwickTree{
    int n;
    vector<ll> a;

    FenwickTree(int _n){
        n = _n;
        a.resize(n + 1);
    }

    void update(int i, ll v){
        while(i <= n){
            a[i] += v;
            i += LASTBIT(i);
        }
    }

    ll get(int i){
        ll ans = 0;
        while(i > 0){
            ans += a[i];
            i -= LASTBIT(i);
        }
        return ans;
    }
};

ll count_i(vector<int> perm){
    int n = perm.size();
    perm.insert(perm.begin(), -1);
    vector<ll> dp(n+1); dp[0] = 1;
    FenwickTree bit(n+2); bit.update(1, 1);
    ll sum = 1;
    for(int i = 1; i<=n; ++i){
        dp[i] = bit.get(perm[i] + 2);
        bit.update(perm[i] + 2, dp[i]);
        sum += dp[i];
    }
    return sum;
}


vector<int> construct_permutation(ll k){
    int j = 0;
    for(; k >= MASK(j + 1); ++j) ;
    j--;     
    vector<int> ans;
    for(int i = 0; i<=j; ++i) ans.push_back(i);

    ll cur = MASK(j+1);
    while(cur < k){
        vector<int> best_config;
        int l = 0, r = ans.size();

        for(int j = l; j <= r; ++j) {// inserted position
            int found = 0;
            for(int i = l; i <= r; ++i)  { // inserted value
                vector<int> bruh = ans;
                for(int &t: bruh) if (t >= i) t++;
                bruh.insert(bruh.begin() + j, i);

                ll cnt = count_i(bruh);
                if (cnt <= k && maximize(cur, cnt)) {
                    best_config = bruh;
                    found++;
                    break;
                }
            }
            if (found) break;
        }
        ans = best_config;
    }

    return ans;
}

// int main(void){
//     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

//     // for(int i = 2; i<=100; ++i){
//     //     vector<int> perm = construct_permutation(i);
//     //     if (count_i(perm) != i){
//     //         cout << i << " " << count_i(perm) << "\n";
//     //         printArr(perm);
//     //         break;
//     //     }
//     // }

//     for(int i = 0; i<100; ++i){
//         vector<int> perm = construct_permutation(rngesus(5e17, 1e18));
//         cout << perm.size() << endl;
//     }

//     return 0;
// }
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 4 ms 348 KB Output is correct
4 Correct 11 ms 348 KB Output is correct
5 Partially correct 70 ms 348 KB Partially correct
6 Correct 30 ms 604 KB Output is correct
7 Correct 57 ms 472 KB Output is correct
8 Partially correct 95 ms 348 KB Partially correct
9 Correct 12 ms 348 KB Output is correct
10 Partially correct 144 ms 348 KB Partially correct
11 Partially correct 94 ms 348 KB Partially correct
12 Partially correct 76 ms 480 KB Partially correct
13 Partially correct 122 ms 488 KB Partially correct