Submission #954976

#TimeUsernameProblemLanguageResultExecution timeMemory
954976GrindMachineTropical Garden (IOI11_garden)C++17
69 / 100
5052 ms47992 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long int ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define pb push_back
#define endl '\n'
#define sz(a) (int)a.size()
#define setbits(x) __builtin_popcountll(x)
#define ff first
#define ss second
#define conts continue
#define ceil2(x,y) ((x+y-1)/(y))
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "Yes" << endl
#define no cout << "No" << endl

#define rep(i,n) for(int i = 0; i < n; ++i)
#define rep1(i,n) for(int i = 1; i <= n; ++i)
#define rev(i,s,e) for(int i = s; i >= e; --i)
#define trav(i,a) for(auto &i : a)

template<typename T>
void amin(T &a, T b) {
    a = min(a,b);
}

template<typename T>
void amax(T &a, T b) {
    a = max(a,b);
}

#ifdef LOCAL
#include "debug.h"
#else
#define debug(x) 42
#endif

/*



*/

const int MOD = 1e9 + 7;
const int N = 1e5 + 5;
const int inf1 = int(1e9) + 5;
const ll inf2 = ll(1e18) + 5;
const int LOG = 30;

#include "garden.h"
#include "gardenlib.h"

void count_routes(int n, int m, int p, int R[][2], int q, int a[])
{
    vector<int> adj[n];
    rep(i,m){
        int u = R[i][0], v = R[i][1];
        adj[u].pb(v), adj[v].pb(u);
    }

    int up[n*2][LOG];
    memset(up,0,sizeof up);

    rep(u,n){
        auto edges = adj[u];
        if(sz(edges) >= 2){
            {
                int v = edges[1];
                if(u == adj[v][0]){
                    up[u*2][0] = v*2;
                }
                else{
                    up[u*2][0] = v*2+1;
                }
            }

            {
                int v = edges[0];
                if(u == adj[v][0]){
                    up[u*2+1][0] = v*2;
                }
                else{
                    up[u*2+1][0] = v*2+1;
                }
            }
        }
        else{
            int v = edges[0];
            if(u == adj[v][0]){
                up[u*2][0] = v*2;
            }
            else{
                up[u*2][0] = v*2+1;
            }
        }
    }

    rep1(j,LOG-1){
        rep(i,2*n){
            up[i][j] = up[up[i][j-1]][j-1];
        }
    }

    rep(id,q){
        int k = a[id];
        int ans = 0;
        rep(i,n){
            int u = i*2+1;
            if(sz(adj[i]) == 1) u--;
            
            rep(j,LOG){
                if(k&(1<<j)){
                    u = up[u][j];
                }
            }

            if((u/2) == p){
                ans++;
            }
        }

        answer(ans);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...