# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
283952 | hank55663 | Simurgh (IOI17_simurgh) | C++14 | 0 ms | 384 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"
#define x first
#define y second
#define pb push_back
#include<bits/stdc++.h>
using namespace std;
int f[505];
int f2[505];
int Find(int x){
if(f[x]==x)return x;
return f[x]=Find(f[x]);
}
int Find2(int x){
if(f2[x]==x)return x;
return f2[x]=Find2(f2[x]);
}
int check[250500];
int ok[250500];
std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) {
vector<int> ans;
int m=u.size();
for(int i = 0;i<n;i++)f2[i]=i;
for(int i = 0;i<n;i++){
for(int j=0;j<n;j++)f[j]=j;
vector<int> road;
vector<int> road2;
vector<int> candidate;
for(int j = 0;j<m;j++){
if(Find2(u[j])!=Find2(i)&&Find2(v[j])!=Find2(i)){
if(Find(u[j])!=Find(v[j])&&Find2(u[j])!=Find2(v[j])){
road.pb(j);
f[Find(u[j])]=Find(v[j]);
}
}
else if(Find2(u[j])!=Find2(i)||Find2(v[j])!=Find2(i)){
candidate.pb(j);
//printf("%d %d\n",i,j);
}
}
map<int,vector<int> > m;
for(auto it:candidate){
if(Find2(u[it])==Find2(i)){
m[Find(v[it])].pb(it);
}
else{
m[Find(u[it])].pb(it);
}
}
vector<pair<int,vector<int> > > vv;
for(auto it:m){
vv.pb(it);
road2.pb(it.y[0]);
}
for(auto it:road){
road2.pb(it);
}
for(auto it:ans)road2.pb(it);
swap(road,road2);
for(int i = 0;i<vv.size();i++){
int x=-1;
for(auto it:vv[i].y){
if(check[it]){
x=it;
break;
}
}
if(x!=-1)
road[i]=x;
}
int x=count_common_roads(road);
// printf("!\n");
for(int j = 0;j<vv.size();j++){
int need=x;
int now=road[j];
vector<int> res;
if(check[now]&&!ok[now])need++;
for(auto it:vv[j].y){
if(!check[it]){
road[j]=it;
int y=count_common_roads(road);
// printf("! %d\n",it);
if(y>need){
res.clear();
need=y;
}
if(y==need){
res.push_back(it);
}
}
}
for(auto it:res){
check[it]=1,ok[it]=1,ans.pb(it);//printf("%d\n",it);
f2[Find2(v[it])]=Find2(u[it]);
}
for(auto it:vv[j].y){
if(!check[it]){
check[it]=1;
ok[it]=0;
}
}
road[j]=now;
// printf("%d end\n",i);
}
}
return ans;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |