제출 #269367

#제출 시각아이디문제언어결과실행 시간메모리
269367kdh9949장난감 기차 (IOI17_train)C++17
100 / 100
467 ms1784 KiB
#include "train.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pil = pair<int, ll>;
using pli = pair<ll, int>;
using pll = pair<ll, ll>;

using vint = vector<int>;
using vll = vector<ll>;
using vld = vector<ld>;
using vpii = vector<pii>;
using vpil = vector<pil>;
using vpli = vector<pli>;
using vpll = vector<pll>;

#define x first
#define y second
#define all(v) v.begin(),v.end()

vint who_wins(vint a, vint r, vint u, vint v) {
  int n = a.size(), m = u.size();
  vector<vint> e(n), re(n);
  for(int i = 0; i < m; i++) {
    e[u[i]].push_back(v[i]);
    re[v[i]].push_back(u[i]);
  }

  vint elim(n), ch(n), vis(n), deg(n), cur(n), ans(n, 1), ev;
  queue<int> q;
  int leftn = n;
  for(int i = 0; i < n; i++) deg[i] = e[i].size();

  while(leftn) {
    fill(all(ch), 0);
    fill(all(vis), 0);
    copy(all(deg), cur.begin());
    for(int i = 0; i < n; i++) if(!elim[i] && r[i]) { ch[i] = vis[i] = 1; q.push(i); }
    while(!q.empty()) {
      int x = q.front();
      q.pop();
      for(int i : re[x]) {
        if(elim[i] || vis[i]) continue;
        cur[i]--;
        if(a[i] || !cur[i]) {
          ch[i] = vis[i] = 1;
          q.push(i);
        }
      }
    }
    if(count(all(ch), 1) == leftn) break;
    
    copy(all(deg), cur.begin());
    ev.resize(0);
    for(int i = 0; i < n; i++) if(!elim[i] && !ch[i]) {
      ev.push_back(i); elim[i] = 1; q.push(i);
    }
    while(!q.empty()) {
      int x = q.front();
      q.pop();
      for(int i : re[x]) {
        if(elim[i]) continue;
        cur[i]--;
        if(!a[i] || !cur[i]) {
          ev.push_back(i);
          elim[i] = 1;
          q.push(i);
        }
      }
    }

    leftn -= int(ev.size());
    for(int x : ev) {
      ans[x] = 0;
      for(int i : re[x]) deg[i]--;
    }
  }

  return ans;
}
#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...