이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "simurgh.h"
#include <cstdio>
#include <cassert>
#include <vector>
#include <cstdlib>
#include <string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1001000
#define mp make_pair
#define fs first
#define sn second
int n,m,x,y,mx,w,xx,yy,sav,fa[N],p[N];
pair<int,int>a[N],l[N];
vector<int>ans;
int find(int x)
{
	return (fa[x]==x?x:fa[x]=find(fa[x]));
}
std::vector<int> find_roads(int nn, std::vector<int> u, std::vector<int> v) {
	n=nn;
	m=u.size();
	for(int i=1;i<=m;++i)
		l[i]=mp(u[i-1]+1,v[i-1]+1);
	for(int k=1;k<=m;++k){
		if(p[k])continue;
		for(int i=1;i<=n;++i)
			fa[i]=i;
		ans.clear();
		ans.push_back(0);
		xx=l[k].fs;
		yy=l[k].sn;
		// printf("%d:--------------\n",k);
		for(int i=1;i<=m;++i){
			x=find(l[i].fs);
			y=find(l[i].sn);
			// printf("%d %d\n",x,y);
			xx=find(xx);
			yy=find(yy);
			if(x!=y){
				if((x==xx&&y==yy)||(x==yy&&y==xx))continue;
				fa[x]=y;
				ans.push_back(i-1);
			}
		}
		mx=0;
		w=0;
		xx=find(xx);
		yy=find(yy);
		sav=0;
		for(int i=1;i<=m;++i){
			x=find(l[i].fs);
			y=find(l[i].sn);
			if((x==xx&&y==yy)||(x==yy&&y==xx)){
				if(p[i]&&sav)continue;
				ans[0]=i-1;
				a[++w]=mp(i,count_common_roads(ans));
				mx=max(mx,a[w].sn);
				if(p[i])sav=w;
			}
		}
		if(sav)mx=a[sav].sn+2-p[a[sav].fs];
		for(int i=1;i<=w;++i)
			if(a[i].sn==mx)p[a[i].fs]=a[i].sn+2-mx;
	}
	ans.clear();
	for(int i=1;i<=m;++i)
		if(p[i]==2)ans.push_back(i-1);
	return ans;
}
| # | 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... |