結果
| 問題 |
No.416 旅行会社
|
| コンテスト | |
| ユーザー |
tottoripaper
|
| 提出日時 | 2016-10-02 00:07:27 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 165 ms / 4,000 ms |
| コード長 | 2,465 bytes |
| コンパイル時間 | 1,628 ms |
| コンパイル使用メモリ | 169,448 KB |
| 実行使用メモリ | 14,192 KB |
| 最終ジャッジ日時 | 2024-12-14 20:19:06 |
| 合計ジャッジ時間 | 4,577 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:62:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
62 | scanf("%d %d %d", &N, &M, &Q);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:65:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
65 | scanf("%d %d", &fst(bridges[i]), &snd(bridges[i]));
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:73:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
73 | scanf("%d %d", &fst(brokenBridges[i]), &snd(brokenBridges[i]));
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define fst(t) std::get<0>(t)
#define snd(t) std::get<1>(t)
#define thd(t) std::get<2>(t)
using ll = long long;
using P = std::tuple<int,int>;
const int dx[8] = {-1, 1, 0, 0, -1, -1, 1, 1}, dy[8] = {0, 0, -1, 1, -1, 1, -1, 1};
int N, M, Q;
P bridges[200000], brokenBridges[200000];
bool isBroken[200000];
int res[100000];
template <int n>
struct UnionFind2{
UnionFind2(){
init();
}
void init(){
for(int i=0;i<n;++i){
groups[i].clear();
groups[i].emplace_back(i);
members[i] = i;
}
}
void unite(int u, int v){
u = members[u];
v = members[v];
if(u == v){return;}
if(groups[u].size() > groups[v].size()){
std::swap(u, v);
}
for(int w : groups[u]){
members[w] = v;
}
groups[v].insert(groups[v].end(), groups[u].begin(), groups[u].end());
groups[u].clear();
}
bool same(int u, int v){
return members[u] == members[v];
}
std::vector<int> groups[n]; // group number of each member
int members[n];
};
UnionFind2<100000> uf;
int main(){
//*
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
/*/
/*/
scanf("%d %d %d", &N, &M, &Q);
for(int i=0;i<M;++i){
scanf("%d %d", &fst(bridges[i]), &snd(bridges[i]));
--fst(bridges[i]);
--snd(bridges[i]);
}
sort(bridges, bridges+M);
for(int i=0;i<Q;++i){
scanf("%d %d", &fst(brokenBridges[i]), &snd(brokenBridges[i]));
--fst(brokenBridges[i]);
--snd(brokenBridges[i]);
auto it = lower_bound(bridges, bridges+M, brokenBridges[i]);
if(it != bridges + M && *it == brokenBridges[i]){
isBroken[it-bridges] = true;
}
}
for(int i=0;i<M;++i){
if(!isBroken[i]){
uf.unite(fst(bridges[i]), snd(bridges[i]));
}
}
for(int i=0;i<N;++i){
if(uf.same(0, i)){
res[i] = -1;
}
}
for(int i=Q-1;i>=0;--i){
int u, v;
tie(u, v) = brokenBridges[i];
if(!uf.same(0, v)){swap(u, v);}
if(!uf.same(0, u) && uf.same(0, v)){
for(int w : uf.groups[uf.members[u]]){
res[w] = i + 1;
}
}
uf.unite(u, v);
}
for(int i=1;i<N;++i){
printf("%d\n", res[i]);
}
}
tottoripaper