답안 #130416

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
130416 2019-07-15T07:32:30 Z mirbek01 Simurgh (IOI17_simurgh) C++17
컴파일 오류
0 ms 0 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 ++){
        int a = u[ r[i] ], b = v[ r[i] ];
        if(upper(b, a))
            swap(a, b);
        int mx =  0, cntg = 0;
        vector <int> golds;
        for(int j = 0; j < m; j ++){
            int cnt = 0;
            if(upper(b, v[j]))
                cnt ++;
            if(upper(b, u[j]))
                cnt ++;
            if(cnt != 1)
                continue;
            if(used[j] == 2)
                cntg ++;
            if(used[j] == 1)
                continue;
            int pre = r[i];
            r[i] = j;
            int kol = count_common_roads(r);
            if(mx < kol){
                while(!golds.empty()){
                    int last = golds.back();
                    used[last] = 1;
                    golds.pop_back();
                }
                mx = kol;
            }
            if(mx == kol){
                golds.emplace_back(j);
            } else {
                used[j] = 1;
            }
        }
        if(cntg) continue;
        for(int j = 0; j < golds.size(); j ++)
            used[ golds[j] ] = 2;
    }

    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:78:17: warning: unused variable 'pre' [-Wunused-variable]
             int pre = r[i];
                 ^~~
simurgh.cpp:96:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j = 0; j < golds.size(); j ++)
                        ~~^~~~~~~~~~~~~~
/tmp/ccrmiRQw.o: In function `count_common_roads(std::vector<int, std::allocator<int> > const&)':
grader.cpp:(.text+0x210): multiple definition of `count_common_roads(std::vector<int, std::allocator<int> > const&)'
/tmp/cc0BUr51.o:simurgh.cpp:(.text+0x3b0): first defined here
/tmp/ccrmiRQw.o: In function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'
/tmp/cc0BUr51.o:simurgh.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status