Submission #586091

#TimeUsernameProblemLanguageResultExecution timeMemory
586091jasminMechanical Doll (IOI18_doll)C++14
53 / 100
104 ms15480 KiB
#include<bits/stdc++.h>
using namespace std;
#include<doll.h>
//#define int long long

int ind;
vector<int> x;
vector<int> y;

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 create_tree(int h, int maxh, int num, vector<int>& a, int n, int root){

    //cout << ind << " " << h << " " << num << " " << maxh << " " << n << " " << root << "\n";
    if(h==maxh){
        if(num<n) return root;
        return -a[num-n];
    }

    int i=ind;
    x.push_back(0);
    y.push_back(0);
    ind++;

    int child0=-create_tree(h+1, maxh, num, a, n, root);
    int child1=-create_tree(h+1, maxh, num+(1<<h), a, n, root);

    x[i-1]=child0;
    y[i-1]=child1;
    return i;
}

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

int binarytree(int i, int num, int h, int maxh, vector<int> a){
    if(h==maxh){
        return -a[num];
    }

    x[i]=-binarytree(i*2, num, h+1, maxh, a);
    y[i]=-binarytree(i*2+1, num+(1<<h), h+1, maxh, a);
    return i;
}

void solve16(int m, vector<int> a){
    int n=a.size(); //=16

    x.clear();
    y.clear();
    vector<int> c(m+1, -1);
    c[0]=a[0];
    c[a[n-1]]=0;
    binarytree(1, 0, 0, 4, a);
    answer(c, x, y);
}

void create_circuit(int m, vector<int> a){
    vector<vector<int> > adi(m+1, vector<int> (0));
    int n=a.size();
    a.push_back(0);
    for(int i=0; i<n; i++){
        adi[a[i]].push_back(a[i+1]);
    }

    x.clear();
    y.clear();
    ind=1;
    vector<int> c(m+1, 0);
    c[0]=a[0];
    for(int i=0; i<=m; i++){
        if(adi[i].size()==0) continue;
        if(adi[i].size()==1){
            c[i]=adi[i][0];
            continue;
        }

        int maxh=pow2(adi[i].size());
        int left=(1<<maxh)-adi[i].size();
        c[i]=-create_tree(0, maxh, 0, adi[i], left, ind);
    }

    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...