답안 #643552

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
643552 2022-09-22T12:17:02 Z andecaandeci Zagonetka (COI18_zagonetka) C++17
0 / 100
122 ms 336 KB
#include <bits/stdc++.h>
using namespace std;

const int N = 105;
int n, a[N], m, deg[N], mn[N], mx[N], Deg[N], order[N];
vector<int> g[N];

vector<int> toposort() {
  vector<int> d(n + 1);
  for(int i = 1; i <= n; i++) {
    for(auto u : g[i]) {
      d[u]++;
    }
  }

  queue<int> q;
  for(int i = 1; i <= n; i++) if(!d[i]) q.push(i);

  vector<int> ret(n + 1);
  int cnt = 0;
  while(!q.empty()) {
    int v = q.front(); q.pop();
    ret[v] = ++cnt;
    for(auto u : g[v]) {
      d[u]--;
      if(d[u] == 0) {
        q.push(u);
      }
    }
  }
  assert(cnt == n);
  return ret;

}

bool ask(int l, int r)
{
  cout << "query ";
  // swap(a[order[l]], a[order[r]]);
  // for(int i = 1; i <= n; i++) cout << a[i] << " ";
  // swap(a[order[l]], a[order[r]]);

  

  auto v = toposort();
  for(int i = 1; i <= n; i++) cout << v[i] << " ";
  cout << endl;

  int x;
  cin >> x;
  return x;
}

int main() 
{
  cin.tie(0); ios_base::sync_with_stdio(0);

  cin >> n;  
  for(int i = 1; i <= n; i++) cin >> a[i];

  for(int i = 1; i <= n; i++) {
    for(int j = 1; j <= n; j++) {
      if(a[j] > a[order[i - 1]] && (a[order[i]] == 0 || a[order[i]] > a[j])) {
        order[i] = j;
      }
    }
  }

  for(int i = 1; i <= n; i++) {
    for(int j = i + 1; j <= n; j++) {
      g[order[i]].push_back(order[j]);
    }
  }

  // for(int i = 1; i <= n; i++) cerr << order[i] << " "; cout << '\n';
  
  for(int i = 1; i <= n; i++) {
    for(int j = i + 1; j <= n; j++) {
      // cout << i << " " << j << endl;
      // cout << order[i] << " " << order[j] << endl;
      auto it = find(g[order[i]].begin(), g[order[i]].end(), order[j]);
      g[order[i]].erase(it);
      g[order[j]].push_back(order[i]);
      if(!ask(i, j)) {
        auto it = find(g[order[j]].begin(), g[order[j]].end(), order[i]);
        g[order[j]].erase(it);
        g[order[i]].push_back(order[j]);
        deg[order[j]]++;
        Deg[order[j]]++;
        for(int k = j + 1; k <= n; k++) {
          auto it = find(g[order[i]].begin(), g[order[i]].end(), order[k]);
          g[order[i]].erase(it);
        }
        break;
      } else {
        auto it = find(g[order[j]].begin(), g[order[j]].end(), order[i]);
        g[order[j]].erase(it);
      }
     }  
  }

  // for(int i = 1; i <= n; i++) {
  //   for(auto v : g[i]) {
  //     cout << i << " -> " << v << '\n';
  //   }
  // }

  priority_queue<int> q;
  for(int i = 1; i <= n; i++) if(!deg[i]) q.push(i);
  int cnt = 0;
  while(!q.empty()) {
    int v = q.top(); q.pop();
    mx[v] = ++cnt;
    for(auto u : g[v]) {
      deg[u]--;
      if(deg[u] == 0) {
        q.push(u);
      }
    }
  }

  for(int i = 1; i <= n; i++) if(!Deg[i]) q.push(-i);

  cnt = 0;
  while(!q.empty()) {
    int v = q.top(); q.pop();
    v = -v;
    mn[v] = ++cnt;
    for(auto u : g[v]) {
      Deg[u]--;
      if(Deg[u] == 0) {
        q.push(-u);
      }
    }
  }

  cout << "end\n";
  for(int i = 1; i <= n; i++) cout << mn[i] << " ";
  cout << '\n';
  for(int i = 1; i <= n; i++) cout << mx[i] << " ";
  cout << endl;

}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 208 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 1 ms 208 KB Output is correct
4 Correct 0 ms 208 KB Output is correct
5 Incorrect 1 ms 220 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 208 KB Output is correct
2 Incorrect 35 ms 208 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 122 ms 336 KB Output isn't correct
2 Halted 0 ms 0 KB -