提出 #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
結果
AC × 2
AC × 87
セット名 テストケース
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