Submission #102189

# Submission time Handle Problem Language Result Execution time Memory
102189 2019-03-23T10:49:54 Z TomGautot Ball Machine (BOI13_ballmachine) C++14
0 / 100
222 ms 42188 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;
    computeData(root, 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){
            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:140:10: warning: 'lastRolledDepth' may be used uninitialized in this function [-Wmaybe-uninitialized]
     int *lastRolledDepth;
          ^~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Runtime error 3 ms 512 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 62 ms 7288 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 51 ms 7132 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 2 ms 384 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Runtime error 3 ms 512 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 7 ms 896 KB Execution killed with signal 11 (could be triggered by violating memory limits)
10 Runtime error 13 ms 2048 KB Execution killed with signal 11 (could be triggered by violating memory limits)
11 Runtime error 61 ms 7160 KB Execution killed with signal 11 (could be triggered by violating memory limits)
12 Runtime error 62 ms 7160 KB Execution killed with signal 11 (could be triggered by violating memory limits)
13 Runtime error 63 ms 7160 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# Verdict Execution time Memory Grader output
1 Runtime error 32 ms 8072 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 153 ms 26504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 89 ms 10844 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 34 ms 8192 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Runtime error 35 ms 8312 KB Execution killed with signal 11 (could be triggered by violating memory limits)
6 Runtime error 35 ms 8188 KB Execution killed with signal 11 (could be triggered by violating memory limits)
7 Runtime error 23 ms 5632 KB Execution killed with signal 11 (could be triggered by violating memory limits)
8 Runtime error 20 ms 8064 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 142 ms 26460 KB Execution killed with signal 11 (could be triggered by violating memory limits)
10 Runtime error 203 ms 26360 KB Execution killed with signal 11 (could be triggered by violating memory limits)
11 Runtime error 170 ms 26488 KB Execution killed with signal 11 (could be triggered by violating memory limits)
12 Runtime error 133 ms 18424 KB Execution killed with signal 11 (could be triggered by violating memory limits)
13 Runtime error 174 ms 37112 KB Execution killed with signal 11 (could be triggered by violating memory limits)
14 Runtime error 98 ms 10860 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# Verdict Execution time Memory Grader output
1 Runtime error 62 ms 13436 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 168 ms 18956 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 161 ms 33912 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 124 ms 21228 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Runtime error 139 ms 21340 KB Execution killed with signal 11 (could be triggered by violating memory limits)
6 Runtime error 141 ms 21240 KB Execution killed with signal 11 (could be triggered by violating memory limits)
7 Runtime error 125 ms 15316 KB Execution killed with signal 11 (could be triggered by violating memory limits)
8 Runtime error 182 ms 33816 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 160 ms 26488 KB Execution killed with signal 11 (could be triggered by violating memory limits)
10 Runtime error 177 ms 26492 KB Execution killed with signal 11 (could be triggered by violating memory limits)
11 Runtime error 156 ms 26360 KB Execution killed with signal 11 (could be triggered by violating memory limits)
12 Runtime error 159 ms 19000 KB Execution killed with signal 11 (could be triggered by violating memory limits)
13 Runtime error 221 ms 42188 KB Execution killed with signal 11 (could be triggered by violating memory limits)
14 Runtime error 96 ms 10840 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# Verdict Execution time Memory Grader output
1 Runtime error 133 ms 26348 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Runtime error 154 ms 19064 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Runtime error 203 ms 41976 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Runtime error 174 ms 26272 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Runtime error 157 ms 26360 KB Execution killed with signal 11 (could be triggered by violating memory limits)
6 Runtime error 158 ms 26604 KB Execution killed with signal 11 (could be triggered by violating memory limits)
7 Runtime error 143 ms 18936 KB Execution killed with signal 11 (could be triggered by violating memory limits)
8 Runtime error 222 ms 41988 KB Execution killed with signal 11 (could be triggered by violating memory limits)
9 Runtime error 97 ms 10728 KB Execution killed with signal 11 (could be triggered by violating memory limits)