Submission #1261775

#TimeUsernameProblemLanguageResultExecution timeMemory
1261775goulthenTropical Garden (IOI11_garden)C++20
100 / 100
1326 ms33364 KiB
#include "garden.h"
#include "gardenlib.h"
#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,b) for (int i = a; i <= b; i++)
#define pb push_back
#define pii pair<int, int>
#define fi first
#define se second

const int MAXN = 2e5+10;
const int INF = 1e9 + 5;
vector<pii> g[MAXN];
vector<int> g2[2*MAXN];
int p[2*MAXN], dist[2*MAXN][2];

void count_routes(int N, int M, int P, int R[][2], int Q, int G[])
{
  rep(i,0,M-1) {
    g[R[i][0]].pb({R[i][1],i});
    g[R[i][1]].pb({R[i][0],i});
  }

  rep(i,0,N-1) {
    pii b = g[i][0], b2 = {-1,-1};
    if (g[i].size()>1) b2 = g[i][1];
    if (b.se != g[b.fi][0].se) {
      p[i] = b.fi;
      if (b2.fi==-1) p[i+N] = b.fi;
    }
    else {
      p[i] = b.fi + N;
      if (b2.fi==-1) p[i+N] = b.fi + N;
    }
    if (b2.se==-1) continue;

    if (b2.se != g[b2.fi][0].se) p[i+N] = b2.fi;
    else p[i+N] = b2.fi + N;
  }

  rep(i,0,2*N-1) g2[p[i]].pb(i);
  rep(i,0,2*N-1) rep(j,0,1) dist[i][j] = INF;

  int cc = P;
  rep(t,0,1) {
    queue<pii> bfs;
    bfs.push({0,cc});
    while (!bfs.empty()) {
      auto [d, u] = bfs.front();
      bfs.pop();
      if (dist[u][t]!=INF) continue;
      dist[u][t] = d;

      for (int &v : g2[u]) {
        bfs.push({d+1,v});
      }
    }
    cc+=N;
  }

  const auto gc = [&](int u) -> int {
    int len = 0;
    vector<bool> vis(2*N, 0);

    int cur = u;
    while (!vis[cur]) {
      vis[cur] = 1;
      len++;
      cur = p[cur];
    }

    if (cur != u) return INF;
    return len;
  };

  int s1 = gc(P), s2 = gc(P+N);

  rep(i,0,Q-1) {
    int k = G[i], ans = 0;
    rep(i,0,N-1) {
      //cout << i << ' ' << dist[i][0] << ' ' << s1 << '\n';
      if (dist[i][0] <= k && (k-dist[i][0])%s1 == 0) ans++;
      else if (dist[i][1] <= k && (k-dist[i][1])%s2 == 0) ans++;
    }

    answer(ans);
  }
}


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