답안 #970467

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
970467 2024-04-26T14:58:20 Z steveonalex 순열 (APIO22_perm) C++17
94.6667 / 100
818 ms 848 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();

        int cap = rngesus(0, 20) == 0;
        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 > cap) 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;
// }
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 6 ms 344 KB Output is correct
4 Correct 21 ms 348 KB Output is correct
5 Partially correct 233 ms 444 KB Partially correct
6 Correct 111 ms 592 KB Output is correct
7 Correct 291 ms 448 KB Output is correct
8 Partially correct 530 ms 704 KB Partially correct
9 Correct 40 ms 348 KB Output is correct
10 Partially correct 818 ms 696 KB Partially correct
11 Partially correct 510 ms 432 KB Partially correct
12 Partially correct 349 ms 596 KB Partially correct
13 Partially correct 595 ms 848 KB Partially correct