# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
130417 | mirbek01 | Simurgh (IOI17_simurgh) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 e = r[i];
r[i] = j;
int kol = count_common_roads(r);
r[i] = e;
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 < (int)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;
}