답안 #130458

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
130458 2019-07-15T08:32:35 Z mirbek01 Simurgh (IOI17_simurgh) C++11
0 / 100
3 ms 1016 KB
#include "simurgh.h"
//#include "grader.cpp"
#include <bits/stdc++.h>

using namespace std;

const int N = 3e4 + 2;

int p[N], sz[N], used[N];
vector <int> g[N];

int f_s(int v){
    return (p[v] == v)?v:p[v] = f_s(p[v]);
}

void u_s(int a, int b){
    a = f_s(a);
    b = f_s(b);
    if(a != b){
        if(sz[a] < sz[b])
            swap(a, b);
        p[b] = a;
        sz[a] += sz[b];
    }
}

int tin[N], tout[N], timer;

void dfs(int v, int pr){
    tin[v] = ++ timer;
    for(int to : g[v]){
        if(to == pr)
            continue;
        dfs(to, v);
    }
    tout[v] = timer;
}

bool upper(int a, int b){
    return tin[a] <= tin[b] && tout[a] >= tout[b];
}

vector<int> find_roads(int n, vector<int> u, vector<int> v) {
      vector<int> r(n - 1);
      int m = (int)u.size();
      for(int i = 0; i < n; i ++)
            p[i] = i, sz[i] = 1;
      int pt = 0;
      for(int i = 0; i < m; i ++){
            if(f_s(u[i]) != f_s(v[i])){
                  r[pt ++] = i;
                  u_s(u[i], v[i]);
                  g[u[i]].push_back(v[i]);
                  g[v[i]].push_back(u[i]);
            }
      }
      dfs(0, 0);
      for(int i = 0; i < pt; i ++){
            vector <int> ind, rs;
            int a = u[ r[i] ], b = v[ r[i] ];
            if(upper(b, a))
                  swap(a, b);
            for(int j = 0; j < m; j ++){
                  int cnt = 0;
                  if(upper(b, u[j]))
                        cnt ++;
                  if(upper(b, v[j]))
                        cnt ++;
                  if(cnt == 1){
                        if(used[j] == 2){
                              ind.clear();
                              break;
                        }
                        if(used[j] == 1)
                              continue;
                        ind.push_back(j);
                  }
            }
            int mx = 0;
            for(int j = 0; j < ind.size(); j ++){
                  int id = ind[j], pre = r[i];
                  r[i] = id;
                  int ret = count_common_roads(r);
                  mx = max(mx, ret);
                  r[i] = pre;
                  rs.emplace_back(ret);
            }
            for(int j = 0; j < rs.size(); j ++){
                  if(rs[j] == mx){
                        used[ ind[j] ] = 2;
                  } else {
                        used[ ind[j] ] = 1;
                  }
            }
      }
      pt = 0;
      for(int i = 0; i < m; i ++){
            if(used[i] == 2)
                  r[pt ++] = i;
      }
      return r;
}

Compilation message

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:80:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j = 0; j < ind.size(); j ++){
                            ~~^~~~~~~~~~~~
simurgh.cpp:88:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j = 0; j < rs.size(); j ++){
                            ~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1016 KB WA in grader: NO
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1016 KB WA in grader: NO
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1016 KB WA in grader: NO
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 1016 KB correct
2 Incorrect 3 ms 1016 KB WA in grader: NO
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1016 KB WA in grader: NO
2 Halted 0 ms 0 KB -