Submission #587094

#TimeUsernameProblemLanguageResultExecution timeMemory
587094jasminMechanical Doll (IOI18_doll)C++14
100 / 100
113 ms13756 KiB
#include<bits/stdc++.h>
using namespace std;
#include<doll.h>
const int inf=1e9+7;

/*void answer(vector<int> c, vector<int> x, vector<int> y){
    cout << c.size() << "\n";
    for(auto e: c){
        cout << e << " ";
    }
    cout << "\n";
    cout << x.size() << "\n";
    for(int i=0; i<(int)x.size(); i++){
        cout << x[i] << " " << y[i] << "\n";
    }
}*/

int pow2(int x){
    int ans=1;
    while(ans<x){
        ans*=2;
    }
    return ans;
}

void make_tree(int v, int h, int n, vector<int>& num){
    if((1<<h)>=n) return;

    num[v*2+1]=num[v];
    num[v*2+2]=num[v]+(1<<h);
    make_tree(v*2+1, h+1, n, num);
    make_tree(v*2+2, h+1, n, num);
}

vector<int> x;
vector<int> y;
int ind=1;
int enumerate(int v, int h, int n, vector<int>& is){
    if((1<<h)>=n){
        return -is[v];
    }

    int child0=enumerate(v*2+1, h+1, n, is);
    int child1=enumerate(v*2+2, h+1, n, is);
    if(child0==-inf && child1==-inf){
        return -inf;
    }

    x.push_back(-child0);
    y.push_back(-child1);
    int i=ind;
    ind++;
    return i;
}

void create_circuit(int m, vector<int> a){
    a.push_back(0);
    int n=a.size();

    int p=pow2(n);
    vector<int> num(2*p, 0);
    make_tree(0, 0, n, num);

    vector<int> is(2*p, inf);
    //cout << p << "\n";
    vector<pair<int,int> > sorted;
    for(int i=2*p-2; i>=0 && (int)sorted.size()<n; i--){
        sorted.push_back({num[i], i});
    }
    sort(sorted.begin(), sorted.end());
    for(int i=0; i<n; i++){
        int v=sorted[i].second;
        is[v]=a[i];
        //cout << v << " (" << num[v] << ") " << a[i] << "\n";
    }

    int root=enumerate(0, 0, n, is);
    for(int i=0; i<(int)x.size(); i++){
        if(x[i]==inf) x[i]=-root;
        if(y[i]==inf) y[i]=-root;
    }
    vector<int> c(m+1, -root);
    answer(c, x, y);
}

/*signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int m, n;
    cin >> m >> n;
    vector<int> a(n);
    for(int i=0; i<n; i++){
        cin >> a[i];
    }
    create_circuit(m, a);
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...