Submission #1263899

#TimeUsernameProblemLanguageResultExecution timeMemory
1263899julia_08Tropical Garden (IOI11_garden)C++20
100 / 100
1718 ms63844 KiB
#include <bits/stdc++.h>

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

using namespace std;

const int MAXN = 3e5 + 10;

vector<pair<int, int>> edges[MAXN];

vector<int> adj[MAXN][2];

int dist[MAXN][2];

int marc[MAXN], comp[MAXN];

int sz[MAXN], deg[MAXN];

void dfs_1(int v, int x){

  marc[v] = 1;

  for(auto u : adj[v][1]){
    if(!marc[u]){
      dist[u][x] = dist[v][x] + 1;
      dfs_1(u, x);
    }
  }

}

void dfs_2(int v, int c){

  comp[v] = c;
  sz[c] ++;

  for(auto u : adj[v][0]){
    if(deg[u] == 0) continue;
    if(!comp[u]) dfs_2(u, c);
  }

}

void lenhadora(int n){

  queue<int> q;

  for(int i=0; i<(2 * n); i++){
    if(deg[i] == 0){
      q.push(i);
    }
  }

  while(!q.empty()){

    int v = q.front();
    q.pop();

    for(auto u : adj[v][0]){
      deg[u] --;
      if(deg[u] == 0) q.push(u);
    }

  }

}

void count_routes(int n, int m, int p, int r[][2], int q, int g[]){

  for(int i=0; i<(2 * n); i++){
    
    marc[i] = comp[i] = 0;
    dist[i][0] = dist[i][1] = -1;
    
    adj[i][0].clear();
    adj[i][1].clear();
  
  }

  for(int i=0; i<m; i++){
    edges[r[i][0]].push_back({i, r[i][1]});
    edges[r[i][1]].push_back({i, r[i][0]});
  }

  for(int i=0; i<n; i++) sort(edges[i].begin(), edges[i].end());

  for(int i=0; i<n; i++){

    for(int k=0; k<2; k++){

      int x = 0;

      if(k == 1 && edges[i].size() == 1) x = 1;

      auto [e, j] = edges[i][(x ? 0 : k)];

      if(e != edges[j][0].first){

        adj[i + k * n][0].push_back(j);
        adj[j][1].push_back(i + k * n);

        deg[j] ++;

      } else{

        adj[i + k * n][0].push_back(j + n);
        adj[j + n][1].push_back(i + k * n);

        deg[j + n] ++;

      }

    }

  }

  dist[p][0] = 0;
  dfs_1(p, 0);

  for(int i=0; i<(2 * n); i++) marc[i] = 0;

  dist[p + n][1] = 0;
  dfs_1(p + n, 1);

  lenhadora(n);

  int c = 0;

  for(int i=0; i<(2 * n); i++){
    if(deg[i] == 0) continue;
    if(!comp[i]) dfs_2(i, ++c);
  }

  for(int i=0; i<q; i++){

    int cnt = 0;

    for(int j=0; j<n; j++){

      bool ok = false;

      for(int k=0; k<2; k++){

        if(dist[j][k] == -1) continue;

        int sz_c = sz[comp[p + k * n]];

        if(sz_c == 0){
          ok |= (dist[j][k] == g[i]);

        } else if(dist[j][k] <= g[i]) ok |= ((g[i] - dist[j][k]) % sz_c == 0);

      }

      cnt += ok;

    }

    answer(cnt);

  }

}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...