Submission #1255067

#TimeUsernameProblemLanguageResultExecution timeMemory
1255067madamadam3Obstacles for a Llama (IOI25_obstacles)C++20
24 / 100
73 ms9800 KiB
#include "obstacles.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using pi = pair<int, int>;

#define FOR(i, a, b) for (int i = a; i < b; i++)
#define ROF(i, a, b) for (int i = a; i >= b; i--)
#define each(a, x) for (auto &a : x)
#define all(x) (x).begin(), (x).end()
#define bg(x) (x).begin()
#define en(x) (x).end()
#define rev(x) reverse(all(x))
#define sz(x) int((x).size())
#define srt(x) sort(all(x))
#define cnt(a, x) count(all(x), a)
#define trace(x) each(a, (x)) cout << a << " "
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound

struct DSU {
  int n; vi par, siz;

  DSU() {};
  DSU(int N) {
    n = N; par.resize(n); siz.assign(n, 1);
    iota(all(par), 0);
  }

  int find(int v) {
    if (par[v] == v) return v;
    return par[v] = find(par[v]);
  }

  void unite(int a, int b) {
    a = find(a); b = find(b);
    if (a != b) {
      if (siz[a] < siz[b]) swap(a, b);
      par[b] = a;
      siz[a] += siz[b];
    }
  }
};

int n, m;
DSU dsu;
vi t, h;
// vvi id;

void initialize(vi T, vi H) {
  t = T; h = H;
  n = sz(T), m = sz(H);
  // id.assign(n, vi(m, -1));

  // dsu = DSU(n*m);
  dsu = DSU(m);
  int cd = 0;

  // FOR(i, 0, n) {
  //   FOR(j, 0, m) {
  //     id[i][j] = cd++;
  //   }
  // }

  // FOR(i, 0, n) {
    FOR(j, 0, m) {
      // if (T[i] <= H[j]) continue;
      if (T[n-1] <= H[j]) continue;

      // if (i > 0 && T[i-1] > H[j]) dsu.unite(id[i][j], id[i-1][j]);
      // if (j > 0 && T[i] > H[j-1]) dsu.unite(id[i][j], id[i][j-1]); 
      if (j > 0 && T[n-1] > H[j-1]) dsu.unite(j, j-1); 

      // if (i < n - 1 && T[i+1] > H[j]) dsu.unite(id[i][j], id[i+1][j]);
      // if (j < m - 1 && T[i] > H[j+1]) dsu.unite(id[i][j], id[i][j+1]); 
      if (j < m - 1 && T[n-1] > H[j+1]) dsu.unite(j, j+1); 
    }
  // }
  return;
}

bool can_reach(int L, int R, int S, int D) {
  if (S > D) swap(S, D);
  // return dsu.find(id[0][S]) == dsu.find(id[0][D]);
  return dsu.find(S) == dsu.find(D);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...