제출 #71523

#제출 시각아이디문제언어결과실행 시간메모리
71523KLPPSimurgh (IOI17_simurgh)C++14
51 / 100
348 ms7208 KiB
#include "simurgh.h"
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int> pi;
vector<pi> nei[100];
int parent[500];
int size[500];
void init(int n){
	for(int i=0;i<n;i++){
		size[i]=1;parent[i]=i;
	}
}
int root(int a){
	if(parent[a]==a)return a;
	return root(parent[a]);
}
void merge(int a, int b){/*cout<<a<<" "<<b<<endl;
	for(int i=0;i<7;i++)cout<<parent[i]<<" ";
	cout<<endl;
	for(int i=0;i<7;i++)cout<<size[i]<<" ";
	cout<<endl<<endl;*/
	a=root(a);
	b=root(b);
	if(a==b)return;
	if(size[a]<size[b]){
		parent[a]=b;
		size[b]+=size[a];
		return;
	}
	parent[b]=a;
	size[a]+=size[b];
}
bool samecomponent(int a, int b){/*cout<<a<<" "<<b<<endl;
	for(int i=0;i<7;i++)cout<<parent[i]<<" ";
	cout<<endl;
	for(int i=0;i<7;i++)cout<<size[i]<<" ";
	cout<<endl<<endl;*/
	a=root(a);
	b=root(b);
	if(a==b)return true;
	return false;
}
std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) {
	vector<pair<int,int> >nei[n];
	
	for(int i=0;i<u.size();i++){
		nei[u[i]].push_back(pair<int,int>(v[i],i));
		nei[v[i]].push_back(pair<int,int>(u[i],i));
	}
	int ans[u.size()];
	for(int i=0;i<u.size();i++)ans[i]=-1;
	vector<pair<int,int> >tree[n];
	init(n);
	bool istree[u.size()];
	vector<int> maintree;
	for(int i=0;i<u.size();i++){istree[i]=false;
		if(!samecomponent(u[i],v[i])){istree[i]=true;
			merge(u[i],v[i]);
			tree[u[i]].push_back(pair<int,int>(v[i],i));
			tree[v[i]].push_back(pair<int,int>(u[i],i));
			//cout<<i<<endl;
			maintree.push_back(i);
		}
	}
	int s=count_common_roads(maintree);
	for(int i=0;i<u.size();i++){
		if(!istree[i]){
			queue<int> q;
			int dist[n];
			for(int i=0;i<n;i++)dist[i]=-1;
			dist[u[i]]=0;
			q.push(u[i]);
			while(!q.empty()){
				int node=q.front();q.pop();
				for(int j=0;j<tree[node].size();j++){
					int V=tree[node][j].first;
					if(dist[V]==-1){
						dist[V]=dist[node]+1;
						q.push(V);
					}
				}
			}
			vector<int> edges;
			int pnt=v[i];
			while(dist[pnt]!=0){
				for(int j=0;j<tree[pnt].size();j++){
					int node=tree[pnt][j].first;
					if(dist[node]<dist[pnt]){
						edges.push_back(tree[pnt][j].second);
						pnt=node;
						j=10000;
					}
				}
			}//OK
			/*cout<<"Edge no "<<i<<" : ";
			for(int j=0;j<edges.size();j++)cout<<edges[j]<<" ";
			cout<<endl;*/
			vector<int> indeterminado;
			vector<int> determinado;
			for(int j=0;j<edges.size();j++){
				if(ans[edges[j]]==-1)indeterminado.push_back(edges[j]);
				else determinado.push_back(edges[j]);
			}
			if(determinado.size()==0){
				vector<pair<int,int> >respostas;
				for(int j=0;j<edges.size();j++){
					int lo,hi;
					lo=-1;
					hi=n;
					while(hi-lo>1){
						int mid=(hi+lo)/2;
						if(maintree[mid]<edges[j])lo=mid;
						else hi=mid;
					}
					maintree[hi]=i;
					int A=count_common_roads(maintree);
					respostas.push_back(pair<int,int>(A,edges[j]));
					maintree[hi]=edges[j];
				}
				respostas.push_back(pair<int,int>(s,i));
				sort(respostas.begin(),respostas.end());
				
				/*for(int j=0;j<respostas.size();j++){
					cout<<respostas[j].first<<" ";
				}cout<<endl;
				for(int j=0;j<respostas.size();j++){
					cout<<respostas[j].second<<" ";
				}cout<<endl;*/
				if(respostas[0].first==respostas[respostas.size()-1].first){
					for(int j=0;j<respostas.size();j++){
						ans[respostas[j].second]=0;
					}
				}else{
					for(int j=0;j<respostas.size();j++){ans[respostas[j].second]=0;
						if(respostas[j].first==respostas[0].first){
							ans[respostas[j].second]=1;
						}
					}
				}
			}else{	
				
				vector<pair<int,int> >respostas;
				for(int j=0;j<indeterminado.size();j++){//cout<<indeterminado[j]<<" "<<ans[indeterminado[j]]<<endl;
					int lo,hi;
					lo=-1;
					hi=n;
					while(hi-lo>1){
						int mid=(hi+lo)/2;
						if(maintree[mid]<indeterminado[j])lo=mid;
						else hi=mid;
					}//cout<<maintree[hi]<<" "<<indeterminado[j]<<endl;
					maintree[hi]=i;
					/*for(int i=0;i<n-1;i++){
						cout<<maintree[i]<<" ";
					}cout<<endl;*/
					int A=count_common_roads(maintree);
					//cout<<A<<endl;
					respostas.push_back(pair<int,int>(A,indeterminado[j]));
					maintree[hi]=indeterminado[j];
				}//cout<<endl;
				respostas.push_back(pair<int,int>(s,i));
				//cout<<determinado[0]<<" "<<indeterminado.size()<<endl;
				int lo,hi;
				lo=-1;
				hi=n;
				while(hi-lo>1){
					int mid=(hi+lo)/2;
					if(maintree[mid]<determinado[0])lo=mid;
					else hi=mid;
				}
				maintree[hi]=i;
				int reference=count_common_roads(maintree);
				maintree[hi]=determinado[0];
				for(int j=0;j<respostas.size();j++){//cout<<respostas[j].first<<" "<<respostas[j].second<<endl;
					ans[respostas[j].second]=ans[determinado[0]]+reference-respostas[j].first;
				}
			}
		}
		/*cout<<i<<endl;
		for(int i=0;i<u.size();i++){
			cout<<ans[i]<<" ";
		}cout<<endl;
		for(int i=0;i<n-1;i++){
			cout<<maintree[i]<<" ";
		}cout<<endl;*/
	}
	/*for(int i=0;i<u.size();i++){
		cout<<ans[i]<<" ";
	}cout<<endl;*/
	
	vector<int> r;
	for(int i=0;i<u.size();i++){
		if(ans[i]!=0)r.push_back(i);
	}
	return r;
}

컴파일 시 표준 에러 (stderr) 메시지

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:49:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<u.size();i++){
              ~^~~~~~~~~
simurgh.cpp:54:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<u.size();i++)ans[i]=-1;
              ~^~~~~~~~~
simurgh.cpp:59:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<u.size();i++){istree[i]=false;
              ~^~~~~~~~~
simurgh.cpp:69:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<u.size();i++){
              ~^~~~~~~~~
simurgh.cpp:78:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j=0;j<tree[node].size();j++){
                 ~^~~~~~~~~~~~~~~~~~
simurgh.cpp:89:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j=0;j<tree[pnt].size();j++){
                 ~^~~~~~~~~~~~~~~~~
simurgh.cpp:103:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int j=0;j<edges.size();j++){
                ~^~~~~~~~~~~~~
simurgh.cpp:109:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j=0;j<edges.size();j++){
                 ~^~~~~~~~~~~~~
simurgh.cpp:133:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int j=0;j<respostas.size();j++){
                  ~^~~~~~~~~~~~~~~~~
simurgh.cpp:137:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int j=0;j<respostas.size();j++){ans[respostas[j].second]=0;
                  ~^~~~~~~~~~~~~~~~~
simurgh.cpp:146:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j=0;j<indeterminado.size();j++){//cout<<indeterminado[j]<<" "<<ans[indeterminado[j]]<<endl;
                 ~^~~~~~~~~~~~~~~~~~~~~
simurgh.cpp:177:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j=0;j<respostas.size();j++){//cout<<respostas[j].first<<" "<<respostas[j].second<<endl;
                 ~^~~~~~~~~~~~~~~~~
simurgh.cpp:195:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<u.size();i++){
              ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...