Submission #797522

#TimeUsernameProblemLanguageResultExecution timeMemory
797522farhan132Tropical Garden (IOI11_garden)C++17
100 / 100
2389 ms24528 KiB
#include "garden.h"
#include "gardenlib.h"
#include <bits/stdc++.h>
 
using namespace std;
 
typedef int ll;
typedef double dd;
typedef pair<ll , ll> ii;
typedef tuple < ll,  ll, ll > tp;
 
#define ff first
#define ss second
#define pb push_back
#define in insert
#define mem(a , b) memset(a, b ,sizeof(a))


const ll N = 2e5 + 5;
const ll INF = 1e9 + 3;

vector < ll > v[N];

ii nxt(ll node, ll t){
  if(v[node].size() == 1 && t > 0) t = 0; 
  return {v[node][t] , ((node == v[v[node][t]][0] && v[v[node][t]].size() > 1) ? 1 : 0)};
}
ll vis[N][2];
ll dp[N][2][2], P;

ll go(ll node, ll t, ll tar){
  if(make_pair(node, t) == make_pair(P, tar)){
    return dp[node][t][tar] = 0;
  }
  if(dp[node][t][tar] != -1){
    return dp[node][t][tar];
  }
  vis[node][t] = 1;
  auto [n1, t1] = nxt(node, t);
  if(vis[n1][t1] == 1){
    vis[node][t] = 2;
    return dp[node][t][tar] = INF;
  }
  dp[node][t][tar] = min(INF, go(n1, t1, tar) + 1);
  vis[node][t] = 2;
  return dp[node][t][tar];
}

void count_routes(int n, int m, int _P, int R[][2], int Q, int G[]){

  P = _P;
  
  for(ll i = 0; i < m; i++){
    v[R[i][0]].pb(R[i][1]);
    v[R[i][1]].pb(R[i][0]);
  }

  ll cycle[2] = {0, 0}; 
  mem(vis, 0); 
  ii cur = {P, 0};
  while(true){
    vis[cur.ff][cur.ss] = 1;
    //cout << cur.ff << ' ' << cur.ss << '\n';
    ii NXT = nxt(cur.ff, cur.ss);
    cycle[0]++;
    if(NXT == make_pair(P, 0)){
      break;
    }
    if(vis[NXT.ff][NXT.ss]){
      cycle[0] = INF;
      break;
    }
    cur = NXT;
  }
  if(v[P].size() == 1){
      cycle[1] = INF; 
  }else{
    mem(vis, 0); 
    cur = {P, 1};
    while(true){
      vis[cur.ff][cur.ss] = 1;
      ii NXT = nxt(cur.ff, cur.ss);
      cycle[1]++;
      if(NXT == make_pair(P, 1)){
        break;
      }
      if(vis[NXT.ff][NXT.ss]){
        cycle[1] = INF;
        break;
      }
      cur = NXT;
    }
  }
  //cout << cycle[0] << ' ' << cycle[1] << '\n';
  mem(dp, -1);
  for(ll tar = 0; tar < 2; tar++){
    mem(vis, 0);
    for(ll i = 0; i < n; i++){
      for(ll j = 0; j < 1; j++){
        go(i, j, tar);
      }
    }
  }
  for(ll j = 0; j < Q; j++){
    ll ans = 0;
    for(ll tar = 0; tar < 2; tar++){
      for(ll i = 0; i < n; i++){
        if(dp[i][0][tar] <= G[j] && (G[j] - dp[i][0][tar]) % cycle[tar] == 0){
         ans++;
        }
      }
    }
    answer(ans);
  }

  return;
}


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