제출 #1153207

#제출 시각아이디문제언어결과실행 시간메모리
1153207m_bezrutchka마상시합 토너먼트 (IOI12_tournament)C++20
0 / 100
12 ms512 KiB
#include <bits/stdc++.h>
using namespace std;

int n, c, r;
vector<int> s, e, p;

vector< vector<int> > adj;
vector<int> pai;
vector<int> id;
vector<int> label;
int sz;

int add_node(vector<int> &children) {
  adj.push_back({});
  pai.push_back(-1);
  id.push_back(sz);
  for (int x: children) {
    id[sz] = min(id[sz], id[x]);
    pai[x] = sz;
    adj[sz].push_back(x);
  }
  int ret = sz;
  sz++;
  return ret;
}

void print_node(int idx) {
  cerr << idx << ": ";
  cerr << "pai = " << pai[idx] << " | filhos =";
  for (int x: adj[idx]) {
    cerr << " " << x;
  }
  cerr << "\n";
}

void build_tree() {
  vector<int> players;
  for (int i = 0; i < n; i++) {
    add_node(players);
  }
  vector<int> rep(c);
  for (int i = 0; i < c; i++) {
    vector<pair<int,int>> heads;
    for (int j = 0; j < sz; j++) {
      if (pai[j] == -1) {
        heads.push_back({id[j], j});
      }
    }
    sort(heads.begin(), heads.end());
    players.clear();
    for (int j = s[i]; j <= e[i]; j++) {
      players.push_back(heads[j].second);
    }
    rep[i] = add_node(players);
  }
  cerr << "Finished building tree:\n";
  cerr << "Leaves:\n";
  for (int i = 0; i < n; i++) {
    print_node(i);
  }
  cerr << "Non-leaves:\n";
  for (int i = n; i < sz; i++) {
    print_node(i);
  }
}

int cnt_cur;

void dfs(int v) {
  if (adj[v].empty()) {
    return;
  } else {
    label[v] = label[adj[v][0]];
    for (int x: adj[v]) {
      dfs(x);
      label[v] = max(label[v], label[x]);
    }
    if (label[v] == r) {
      cnt_cur++;
    }
  }
}

int get_wins(vector<int> &v, int pos) {
  label.resize(sz);
  for (int i = 0; i < n; i++) {
    label[i] = v[i];
  }
  cnt_cur = 0;
  dfs(sz - 1);
  return cnt_cur;
}

int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
  n = N; c = C; r = R; s.clear(); e.clear(); p.clear();
  for (int i = 0; i < n; i++) {
    p.push_back(K[i]);
  }
  for (int i = 0; i < c; i++) {
    s.push_back(S[i]);
    e.push_back(E[i]);
  }
  build_tree();

  int best_resp = -1, best_pos = -1;
  for (int pos = 0; pos < n; pos++) {
    vector<int> vals;
    for (int i = 0; i < pos; i++) {
      vals.push_back(p[i]);
    }
    vals.push_back(r);
    for (int i = pos; i < n - 1; i++) {
      vals.push_back(p[i]);
    }
    int cur = get_wins(vals, pos);
    if (cur > best_resp) {
      best_resp = cur;
      best_pos = pos;
    }
  }

  return best_pos;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...