結果

問題 No.416 旅行会社
ユーザー IL_msta
提出日時 2017-03-01 19:16:09
言語 C++11
(gcc 13.3.0)
結果
AC  
実行時間 286 ms / 4,000 ms
コード長 3,465 bytes
コンパイル時間 1,897 ms
コンパイル使用メモリ 134,228 KB
実行使用メモリ 13,804 KB
最終ジャッジ日時 2024-12-14 20:22:07
合計ジャッジ時間 6,098 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 21
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#pragma region GNUC
//
//https://yukicoder.me/wiki/auto_vectorization
#ifdef __GNUC__
#pragma GCC optimize ("O3")
#pragma GCC target ("avx")
#endif
#pragma endregion
#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <vector>
#include <valarray>
//#include <array>//x C++ (G++ 4.6.4)
#include <queue>
#include <complex>
#include <set>
#include <map>
#include <stack>
#include <list>
#include <cassert>//assert();
#include <fstream>
#include <random>
/////////
#define REP(i, x, n) for(int i = x; i < n; ++i)
#define rep(i,n) REP(i,0,n)
/////////
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
#define PII pair<int,int>
/////////
using namespace::std;
//
template<class T>
inline T gcd(T a, T b){return b ? gcd(b, a % b) : a;}
//inline T gcd(T a, T b){return b == 0 ? a : gcd(b, a % b);}
//
template<class T>
inline T lcm(T a, T b){return a / gcd(a, b) * b;}
//inline T lcm(T a, T b){return a * b / gcd(a, b);}
////////////////////////////////
class UnionFind{
public:
int cNum;//
vector<int> parent;
vector< vector<int> > Glist;
UnionFind(int n){
cNum = n;
parent = vector<int>(n);
Glist.resize(n);
for(int i=n-1;i>=0;--i){
parent[i] = i;
Glist[i].push_back(i);
}
}
int find(int x){
if( parent[x] == x ){return x;}
return parent[x] = find( parent[x] );
}
bool same(int x,int y){return find(x) == find(y);}
void add(int x,int y){//union
x = find(x);
y = find(y);
if( x==y )return;
parent[x] = y;
if( Glist[y].size() < Glist[x].size() ){
swap(Glist[x],Glist[y]);
}
Glist[y].insert(Glist[y].end(),Glist[x].begin(),Glist[x].end() );
}
};
void solve(){
int N,M,Q;
cin >> N >> M >> Q;
vector<pair<int,int> > GraphEdge(M);
for(int i=0;i<M;++i){
int A,B;
cin >> A >> B;
--A;--B;//A<B
GraphEdge[i] = make_pair(A,B);
}
sort( GraphEdge.begin(),GraphEdge.end() );
vector<bool> useEdge(M,true);
vector<pair<int,int> > AddEdge(Q);
vector< pair<int,int> >::iterator vpitr,vpbegin,vpend;
vpbegin = GraphEdge.begin();
vpend = GraphEdge.end();
for(int i=0;i<Q;++i){
int C,D;
cin >> C >> D;
--C;--D;//C<D
AddEdge[i] = make_pair(C,D);
int index = lower_bound( vpbegin,vpend,AddEdge[i] ) - vpbegin;
useEdge[index] = false;
}
UnionFind uf(N);
for(int i=0;i<M;++i){
if( !useEdge[i] ) continue;
uf.add(GraphEdge[i].first,GraphEdge[i].second);
}
vector<int> ans(N,0);
int root = 0;
vector<int>::iterator Litr,Lbegin,Lend;
Litr = uf.Glist[uf.find(root)].begin();
Lend = uf.Glist[uf.find(root)].end();
for(;Litr != Lend;++Litr){
ans[*Litr] = -1;
}
for(int i=Q-1;i>=0;--i){
int x = AddEdge[i].first;
int y = AddEdge[i].second;
if( uf.same(x,y) ) continue;
if( uf.same(x,root) ){
Litr = uf.Glist[uf.find(y)].begin();
Lend = uf.Glist[uf.find(y)].end();
}else if( uf.same(y,root) ){
Litr = uf.Glist[uf.find(x)].begin();
Lend = uf.Glist[uf.find(x)].end();
}else{
uf.add(x,y);
continue;
}
for(;Litr!=Lend;++Litr){
ans[*Litr] = i+1;
}
uf.add(x,y);
}
for(int i=1;i<N;++i){
cout << ans[i] << endl;
}
}
signed main(void){
std::cin.tie(0);
std::ios::sync_with_stdio(false);
//std::cout << std::fixed;//10
//cout << setprecision(16);//
solve();
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0