Submission #102193

# Submission time Handle Problem Language Result Execution time Memory
102193 2019-03-23T11:00:50 Z TomGautot Ball Machine (BOI13_ballmachine) C++14
0 / 100
201 ms 41992 KB
#include <bits/stdc++.h>

#define INF 999999999

using namespace std;

vector<vector<int> > treeAdj;
vector<int> smallestInSubtree, freePlacesInSubtree, depth;
int n, q;
int root;

void computeData(int node, int d){

    int chld = treeAdj[node].size();
    depth[node] = d;
    //printf("Getting data for node %d (depth %d)\n", node, d);
    if(chld == 0){
        //printf("IT S A LEAF!\n");
        smallestInSubtree[node] = node;
        freePlacesInSubtree[node] = 1;
        return;
    }

    int sml = node;
    int fps = 1;
    int v;

    vector<pair<int, int> > newSortedAdj;

    for(int i = 0; i < chld; i++){
        v = treeAdj[node][i];
        //printf("%d -th child of %d is %d\n", i+1, node, v);
        computeData(v, d+1);
        newSortedAdj.push_back({smallestInSubtree[v], v});
        sml = min(sml, smallestInSubtree[v]);
        fps+= freePlacesInSubtree[v];
    }

    sort(newSortedAdj.begin(), newSortedAdj.end());
    for(int i = 0; i < chld; i++){
        treeAdj[node][i] = newSortedAdj[i].second;
    }

    smallestInSubtree[node] = sml;
    freePlacesInSubtree[node] = fps;

    //printf("Got data for node %d (depth %d)\n", node, d);
    return;
}

void fillAllSubtree(int node){
    if(freePlacesInSubtree[node] == 0) return;
    freePlacesInSubtree[node] = 0;
    for(int i = 0; i < treeAdj[node].size(); i++){
        fillAllSubtree(treeAdj[node][i]);
    }
}

int addBalls(int node, int val){ // returns new val after filling subtree of node
    if(val == 0 || freePlacesInSubtree[node] <= 0) return val;

    int freePlaces = freePlacesInSubtree[node];

    if(freePlaces < val){
        fillAllSubtree(node);
        return val-freePlaces;
    }
    else if(freePlaces == val){
        // This node is the one to be output
        fillAllSubtree(node);
        cout << node+1 << endl;
        return 0;
    }

    int sz = treeAdj[node].size();
    for(int i = 0; i < sz && val > 0; i++){
        val = addBalls(treeAdj[node][i], val);
    }
    return val;
}

int removeBall(int node, int val, int *lastRolledDepth){
    if(node == val){
        return 1;
    }
    int sz = treeAdj[node].size();
    if(sz == 0){
        return 0;
    }

    bool nodeIsFree = freePlacesInSubtree[node] != 0;

    //cout << "Is node " << node << " free " << (nodeIsFree?"1":"0") << endl;

    int returnCode, v;
    for(int i = 0; i < sz; i++){
        v = treeAdj[node][i];
        returnCode = removeBall(v, val, lastRolledDepth);
        if(returnCode == 1){
            if(!nodeIsFree){
                if(node == root){
                    freePlacesInSubtree[root]++;
                    *lastRolledDepth = 0;
                    return 2;
                }
                else return 1;
            }
            freePlacesInSubtree[v]++;
            *lastRolledDepth = depth[v];
            return 2;
        }
        if(returnCode == 2) return 2;
    }

    return 0;

}

int main()
{
    int p;
    cin >> n >> q;
    depth.resize(n);
    treeAdj.resize(n);
    smallestInSubtree.resize(n);
    freePlacesInSubtree.resize(n);
    for(int i = 0; i < n; i++){
        cin >> p;
        if(p == 0) root = i;
        else{
            treeAdj[p-1].push_back(i);
        }
    }

    //cout << "Going to compute data" << endl;
    
    //return 0;
    
    computeData(root, 0);
    
    //return 0;
    //cout << "Data was computedd successfully" << endl;

    int action, val;
    int *lastRolledDepth;
    for(int i = 0; i < q; i++){
        cin >> action >> val;


        if(action == 1){
            continue;
            addBalls(root, val);
        }
        else{
            val--;
            removeBall(root, val, lastRolledDepth);
            //cout << "Last rolled depth is " << *lastRolledDepth << endl;
            cout << depth[val] - *lastRolledDepth << endl;
        }

    }


    return 0;
}

Compilation message

ballmachine.cpp: In function 'void fillAllSubtree(int)':
ballmachine.cpp:54:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < treeAdj[node].size(); i++){
                    ~~^~~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:145:10: warning: 'lastRolledDepth' may be used uninitialized in this function [-Wmaybe-uninitialized]
     int *lastRolledDepth;
          ^~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Runtime error 2 ms 384 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 60 ms 7160 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 61 ms 7164 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 2 ms 352 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Runtime error 3 ms 384 KB Execution killed with signal 11 (could be triggered by violating memory limits)
6 Runtime error 3 ms 640 KB Execution killed with signal 11 (could be triggered by violating memory limits)
7 Runtime error 3 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
8 Runtime error 3 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 6 ms 896 KB Execution killed with signal 11 (could be triggered by violating memory limits)
10 Runtime error 12 ms 2048 KB Execution killed with signal 11 (could be triggered by violating memory limits)
11 Runtime error 58 ms 7208 KB Execution killed with signal 11 (could be triggered by violating memory limits)
12 Runtime error 76 ms 7168 KB Execution killed with signal 11 (could be triggered by violating memory limits)
13 Runtime error 79 ms 7160 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# Verdict Execution time Memory Grader output
1 Runtime error 24 ms 8004 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 145 ms 26396 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 75 ms 10728 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 35 ms 8236 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Runtime error 29 ms 8184 KB Execution killed with signal 11 (could be triggered by violating memory limits)
6 Runtime error 39 ms 8288 KB Execution killed with signal 11 (could be triggered by violating memory limits)
7 Runtime error 25 ms 5496 KB Execution killed with signal 11 (could be triggered by violating memory limits)
8 Runtime error 21 ms 8064 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 123 ms 26368 KB Execution killed with signal 11 (could be triggered by violating memory limits)
10 Runtime error 146 ms 26484 KB Execution killed with signal 11 (could be triggered by violating memory limits)
11 Runtime error 150 ms 26428 KB Execution killed with signal 11 (could be triggered by violating memory limits)
12 Runtime error 131 ms 18524 KB Execution killed with signal 11 (could be triggered by violating memory limits)
13 Runtime error 188 ms 37084 KB Execution killed with signal 11 (could be triggered by violating memory limits)
14 Runtime error 84 ms 10728 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# Verdict Execution time Memory Grader output
1 Runtime error 61 ms 13432 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 135 ms 18976 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 128 ms 33740 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 98 ms 21180 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Runtime error 108 ms 21268 KB Execution killed with signal 11 (could be triggered by violating memory limits)
6 Runtime error 114 ms 21236 KB Execution killed with signal 11 (could be triggered by violating memory limits)
7 Runtime error 93 ms 15312 KB Execution killed with signal 11 (could be triggered by violating memory limits)
8 Runtime error 127 ms 33656 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 177 ms 26516 KB Execution killed with signal 11 (could be triggered by violating memory limits)
10 Runtime error 178 ms 26512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
11 Runtime error 161 ms 26488 KB Execution killed with signal 11 (could be triggered by violating memory limits)
12 Runtime error 159 ms 19064 KB Execution killed with signal 11 (could be triggered by violating memory limits)
13 Runtime error 169 ms 41976 KB Execution killed with signal 11 (could be triggered by violating memory limits)
14 Runtime error 86 ms 10728 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# Verdict Execution time Memory Grader output
1 Runtime error 144 ms 26332 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 152 ms 18936 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 201 ms 41848 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 125 ms 26360 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Runtime error 155 ms 26488 KB Execution killed with signal 11 (could be triggered by violating memory limits)
6 Runtime error 159 ms 26508 KB Execution killed with signal 11 (could be triggered by violating memory limits)
7 Runtime error 148 ms 18936 KB Execution killed with signal 11 (could be triggered by violating memory limits)
8 Runtime error 201 ms 41992 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 87 ms 10728 KB Execution killed with signal 11 (could be triggered by violating memory limits)