提出 #30323833
ソースコード 拡げる
//https://atcoder.jp/contests/abc244/tasks/abc244_g
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
//#pragma GCC optimize ("-O3")
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60;
template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }
//---------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------
∧_∧
∧_∧ (´<_` ) Welcome to My Coding Space!
( ´_ゝ`) / ⌒i @hamayanhamayan
/ \ | |
/ / ̄ ̄ ̄ ̄/ |
__(__ニつ/ _/ .| .|____
\/____/ (u ⊃
---------------------------------------------------------------------------------------------------*/
int N, M;
vector<int> E[101010];
string S;
//---------------------------------------------------------------------------------------------------
deque<int> ans;
int parity[101010];
void add(int cu) {
parity[cu] ^= 1;
ans.push_back(cu);
}
//---------------------------------------------------------------------------------------------------
bool vis[101010];
void dfs(int cu, int pa = -1) {
vis[cu] = true;
add(cu);
fore(to, E[cu]) if(!vis[to]) {
dfs(to, cu);
add(cu);
}
if (0 <= pa && parity[cu] != S[cu]) {
add(pa);
add(cu);
}
}
//---------------------------------------------------------------------------------------------------
void _main() {
cin >> N >> M;
rep(i, 0, M) {
int u, v;
cin >> u >> v;
u--; v--;
E[u].push_back(v);
E[v].push_back(u);
}
cin >> S;
fore(c, S) c -= '0';
dfs(0);
if (parity[0] != S[0]) ans.pop_front();
int K = ans.size();
printf("%d\n", K);
while (!ans.empty()) {
if (ans.size() != K) printf(" ");
printf("%d", ans.front() + 1);
ans.pop_front();
}
printf("\n");
}
/* ///////////////////////// writeup1 start
///////////////////////// writeup2 start
何から始めればいいか困る問題。
構築問題で重要なのはなるべくシンプルなルールで構築を考えていくことである。
今回は特に最適なパス長である必要はないので、若干非効率な方法でも許される。
効率よりも分かりやすさというかシンプルな方法を模索しよう。
## どんな条件でも作れる
今回の問題設定では、条件を満たすどんなグラフとSの組であっても良いパスを作ることができるらしい。
ということは与えられたグラフから辺をいくつか削除して、木にしたとしても答えが得られることになる。
この工夫は試行錯誤の結果ではあるのだが、グラフを木にすることでちょっとだけ問題をシンプルにしておこう。
## 根付き木として考えてみる
スタート地点を1つ決めてそこを根として木を見てみよう。
移動していくと、葉まで行って偶奇が異なる場合はその親に一回戻って葉に再度移れば、偶奇を変更することができる。
これは葉に限らず、他の頂点でも同様である。
つまり、何が言いたいかというと
「現在いる頂点の偶奇を変えたい場合は、親に移動してから自分に戻ってくれば、
『自分の子孫の偶奇を変更することなく』自分の偶奇を変更可能」
ということである。これは非常に都合がいい。
よって、木をdfsで探索しながら子供の偶奇を全部一致させた後、自分の偶奇を以上のテクで一致させれば、
自分を含めた部分木の偶奇を全部一致させた上で親に戻ることができる。
ここら辺の認識が一番難しい。
実装に落とし込むと割と完結になっているので、実装から思想を吸い上げてもいいかもしれない。
## つまり、実装は?
適当に頂点0を始点としてdfsを行う。
訪れた頂点をメモして再度訪れないようにしておけば、無向グラフであっても木上でdfsをしているようなコードが書ける。
各頂点でやることとしては、
1. 子頂点についてdfsを再度行って、子頂点について偶奇が一致するようにする
2. 子頂点について偶奇が一致したら、親を使って自分の偶奇を一致させる
を繰り返す。
注意点として頂点0は親を持っていないので偶奇が調整できない。
これは、数列として0→1→2→1→0みたいな数列を作っていると思うが、
最初の0を取り除けばこれまでの偶奇は変わらずに頂点0の偶奇だけを変更できる。
## 4Nにおさまってる?
正直、未証明ACだが、調整は各頂点で1回ずつしか発生しないし、普通に回るのに2Nかかって調整で2Nかかってで
間に合いそうな雰囲気はある。
(コンテスト中に必ず通すという思想では、始点を0ではなくランダムに設定すると嫌味なケースを回避できるかも)
自分の実装では行ってみて偶奇が合わないなら調整する形をとっているが、そもそも行かなくていいという
ケースを処理すればもっと改善できそう。
///////////////////////// writeup2 end */
提出情報
| 提出日時 | |
|---|---|
| 問題 | G - Construct Good Path |
| ユーザ | hamayanhamayan |
| 言語 | C++ (GCC 9.2.1) |
| 得点 | 600 |
| コード長 | 5929 Byte |
| 結果 | AC |
| 実行時間 | 98 ms |
| メモリ | 17460 KiB |
コンパイルエラー
./Main.cpp: In function ‘void _main()’:
./Main.cpp:81:18: warning: comparison of integer expressions of different signedness: ‘std::deque<int>::size_type’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare]
81 | if (ans.size() != K) printf(" ");
| ~~~~~~~~~~~^~~~
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 600 / 600 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | example0.txt, example1.txt |
| All | 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, 037.txt, 038.txt, 039.txt, 040.txt, 041.txt, 042.txt, 043.txt, 044.txt, 045.txt, 046.txt, 047.txt, 048.txt, 049.txt, 050.txt, 051.txt, 052.txt, 053.txt, 054.txt, 055.txt, 056.txt, 057.txt, 058.txt, 059.txt, 060.txt, 061.txt, 062.txt, 063.txt, 064.txt, 065.txt, 066.txt, 067.txt, 068.txt, 069.txt, 070.txt, 071.txt, 072.txt, 073.txt, 074.txt, 075.txt, 076.txt, 077.txt, 078.txt, 079.txt, 080.txt, 081.txt, 082.txt, 083.txt, 084.txt, example0.txt, example1.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 000.txt | AC | 7 ms | 5996 KiB |
| 001.txt | AC | 21 ms | 7100 KiB |
| 002.txt | AC | 22 ms | 7008 KiB |
| 003.txt | AC | 19 ms | 7120 KiB |
| 004.txt | AC | 79 ms | 15400 KiB |
| 005.txt | AC | 71 ms | 15836 KiB |
| 006.txt | AC | 76 ms | 15416 KiB |
| 007.txt | AC | 72 ms | 16984 KiB |
| 008.txt | AC | 75 ms | 16396 KiB |
| 009.txt | AC | 72 ms | 14688 KiB |
| 010.txt | AC | 70 ms | 15276 KiB |
| 011.txt | AC | 72 ms | 14824 KiB |
| 012.txt | AC | 76 ms | 16688 KiB |
| 013.txt | AC | 85 ms | 17460 KiB |
| 014.txt | AC | 78 ms | 17092 KiB |
| 015.txt | AC | 78 ms | 17056 KiB |
| 016.txt | AC | 74 ms | 17196 KiB |
| 017.txt | AC | 76 ms | 17056 KiB |
| 018.txt | AC | 74 ms | 17048 KiB |
| 019.txt | AC | 78 ms | 17192 KiB |
| 020.txt | AC | 80 ms | 17188 KiB |
| 021.txt | AC | 72 ms | 11344 KiB |
| 022.txt | AC | 69 ms | 11396 KiB |
| 023.txt | AC | 53 ms | 10532 KiB |
| 024.txt | AC | 51 ms | 10532 KiB |
| 025.txt | AC | 62 ms | 11052 KiB |
| 026.txt | AC | 63 ms | 11032 KiB |
| 027.txt | AC | 63 ms | 10908 KiB |
| 028.txt | AC | 63 ms | 10984 KiB |
| 029.txt | AC | 63 ms | 11016 KiB |
| 030.txt | AC | 74 ms | 11424 KiB |
| 031.txt | AC | 66 ms | 10796 KiB |
| 032.txt | AC | 75 ms | 10976 KiB |
| 033.txt | AC | 79 ms | 11324 KiB |
| 034.txt | AC | 61 ms | 10812 KiB |
| 035.txt | AC | 73 ms | 11028 KiB |
| 036.txt | AC | 77 ms | 11360 KiB |
| 037.txt | AC | 67 ms | 10792 KiB |
| 038.txt | AC | 73 ms | 10920 KiB |
| 039.txt | AC | 77 ms | 11456 KiB |
| 040.txt | AC | 65 ms | 10792 KiB |
| 041.txt | AC | 75 ms | 10912 KiB |
| 042.txt | AC | 75 ms | 11356 KiB |
| 043.txt | AC | 66 ms | 10796 KiB |
| 044.txt | AC | 70 ms | 10976 KiB |
| 045.txt | AC | 62 ms | 11620 KiB |
| 046.txt | AC | 58 ms | 11592 KiB |
| 047.txt | AC | 83 ms | 14536 KiB |
| 048.txt | AC | 81 ms | 14152 KiB |
| 049.txt | AC | 51 ms | 10628 KiB |
| 050.txt | AC | 57 ms | 10588 KiB |
| 051.txt | AC | 11 ms | 6364 KiB |
| 052.txt | AC | 12 ms | 6348 KiB |
| 053.txt | AC | 35 ms | 8504 KiB |
| 054.txt | AC | 34 ms | 8496 KiB |
| 055.txt | AC | 45 ms | 9608 KiB |
| 056.txt | AC | 47 ms | 9712 KiB |
| 057.txt | AC | 51 ms | 10352 KiB |
| 058.txt | AC | 51 ms | 10332 KiB |
| 059.txt | AC | 33 ms | 8340 KiB |
| 060.txt | AC | 33 ms | 8328 KiB |
| 061.txt | AC | 39 ms | 9020 KiB |
| 062.txt | AC | 38 ms | 8904 KiB |
| 063.txt | AC | 63 ms | 12132 KiB |
| 064.txt | AC | 60 ms | 11984 KiB |
| 065.txt | AC | 94 ms | 15576 KiB |
| 066.txt | AC | 91 ms | 15564 KiB |
| 067.txt | AC | 90 ms | 15680 KiB |
| 068.txt | AC | 90 ms | 15604 KiB |
| 069.txt | AC | 92 ms | 15688 KiB |
| 070.txt | AC | 93 ms | 15608 KiB |
| 071.txt | AC | 91 ms | 15624 KiB |
| 072.txt | AC | 92 ms | 15612 KiB |
| 073.txt | AC | 98 ms | 15636 KiB |
| 074.txt | AC | 98 ms | 15616 KiB |
| 075.txt | AC | 93 ms | 15648 KiB |
| 076.txt | AC | 91 ms | 15484 KiB |
| 077.txt | AC | 94 ms | 15708 KiB |
| 078.txt | AC | 94 ms | 15548 KiB |
| 079.txt | AC | 98 ms | 15644 KiB |
| 080.txt | AC | 92 ms | 15568 KiB |
| 081.txt | AC | 93 ms | 15628 KiB |
| 082.txt | AC | 93 ms | 15592 KiB |
| 083.txt | AC | 92 ms | 15716 KiB |
| 084.txt | AC | 94 ms | 15632 KiB |
| example0.txt | AC | 10 ms | 5952 KiB |
| example1.txt | AC | 6 ms | 5996 KiB |