差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
programming_algorithm:contest_history:atcoder:2019:0504_agc033 [2019/05/10] ikatakosprogramming_algorithm:contest_history:atcoder:2019:0504_agc033 [2019/05/10] (現在) – [問題] ikatakos
行 116: 行 116:
   * $N$ 個の点で等分された円周   * $N$ 個の点で等分された円周
   * 長さ $M$ の、'R', 'B' のみからなる文字列 $S$ がある   * 長さ $M$ の、'R', 'B' のみからなる文字列 $S$ がある
-  * 隣り合う点と点に挟まれた円弧を「1区間」とし、各区間を赤か青で塗り分け+  * 隣り合う点と点に挟まれた円弧を「1区間」とし、各区間を赤か青で塗る
   * $2^N$ 通りの塗り方の内、以下の条件を満たすものの個数を求めよ   * $2^N$ 通りの塗り方の内、以下の条件を満たすものの個数を求めよ
     * 円周上の $N$ 個の点を1つ選び、そこから出発する     * 円周上の $N$ 個の点を1つ選び、そこから出発する
     * 円周上で隣り合う点まで移動することを $M$ 回繰り返す。点では方向転換が可能     * 円周上で隣り合う点まで移動することを $M$ 回繰り返す。点では方向転換が可能
-    * 赤を通ったら'R'、青を通ったら'B'で記録していくと、移動軌跡を示す長さ $M$ の文字列 $T$ ができる +    * この時、どの点から出発しても、移動方向を上手く選ぶと $i回目の移動で通る区間の色を $S_iが 'R' なら赤色、'B' なら青色にできる
-    * この時、どの点から出発しても、移動方向を上手く選ぶと$T$ を $S$ に一致させることができる+
   * $2 \le N \le 2 \times 10^5$   * $2 \le N \le 2 \times 10^5$
   * $1 \le M \le 2 \times 10^5$   * $1 \le M \le 2 \times 10^5$
行 134: 行 133:
 ===説明のための特殊化=== ===説明のための特殊化===
  
-'R'と'B'を全て逆転して考えても答えは変わらないので、$S$ が'B'から始まる場合は逆転させて、'R' から始まるとして説明する。+'R'と'B'を全て逆転して考えても答えは変わらないので、$S$ が'B'から始まる場合は逆転させて、全て 'R' から始まるとして説明する。
  
 ===制約=== ===制約===
行 149: 行 148:
 <WRAP center round box> <WRAP center round box>
 ここで、$S$ が全て'R'だった場合、1.の条件さえ満たせばよい。 ここで、$S$ が全て'R'だった場合、1.の条件さえ満たせばよい。
-この場合の数え上げは、フィボナッチ数列のようにしてできる。+この場合の数え上げは、フィボナッチ数列のようにしてできる。直線上で考え、先頭と末尾がともに青にならないように注意する。
  
                     長さ      2    3    4    5    6                     長さ      2    3    4    5    6
行 164: 行 163:
  
 $S$ に'B'が含まれる場合、'R'から'B'に切り替わるタイミングで、円周上の移動でも赤と青の境界に存在できないといけない。両方が赤の点で'B'への切り替わりを迎えてしまうとアウト。 $S$ に'B'が含まれる場合、'R'から'B'に切り替わるタイミングで、円周上の移動でも赤と青の境界に存在できないといけない。両方が赤の点で'B'への切り替わりを迎えてしまうとアウト。
-('B'→'R'も同じ事は言えるが、青は連続しないので、必ず両端に赤がある) 
  
 すると、連続する赤の個数にも制約が生じる。結論から言うと、奇数個でなければいけない。 すると、連続する赤の個数にも制約が生じる。結論から言うと、奇数個でなければいけない。
行 184: 行 182:
   * 奇数個だった場合、奇数番号の点から出発するケース   * 奇数個だった場合、奇数番号の点から出発するケース
  
-では、移動後に存在できるのが偶数番号の点であり、どうやっても1や3といった赤と青の境界に存在できない。+では、移動後に存在できるのが偶数番号の点となり、どうやっても奇数番号の赤と青の境界に存在できない。
  
 $K$ が奇数個なら左右端で偶奇を選べるので、どの点から出発しても青に移行できる。 $K$ が奇数個なら左右端で偶奇を選べるので、どの点から出発しても青に移行できる。
行 211: 行 209:
 ^連続できる赤|1|3|3|5|5|7|7|...|k/2*2+1| ^連続できる赤|1|3|3|5|5|7|7|...|k/2*2+1|
  
-また、2番目の条件「...→青→奇数個の赤→青→...」は、先ほどの偶奇を考えると、赤を端から端まで貫通する必要がある。+また、2番目の条件「...→青→奇数個の赤→青→...」の移動は、先ほどの偶奇を考えると、赤を端から端まで貫通する必要がある。
  
 'R'が偶数個なら入った端点と出る端点が同じなので引き返せばいいのだが、奇数個なら入端点と出端点は異なり、貫通が必要になる。 'R'が偶数個なら入った端点と出る端点が同じなので引き返せばいいのだが、奇数個なら入端点と出端点は異なり、貫通が必要になる。
行 219: 行 217:
   →→,             →→→→→→→   →→,             →→→→→→→
   ←←'   ←←'
-    +
 じゃあ、そういう、赤が長く連続する箇所を避けるように選択して移動できないかというと、無理。 じゃあ、そういう、赤が長く連続する箇所を避けるように選択して移動できないかというと、無理。
  
-実はあんまり移動の自由度がなくて、'R','B'が連続する個数と入端点によって、出られる端点は一意に決まるので、+実はあんまり移動の自由度がなくて、'R','B'が連続する個数の偶奇と入端点によって、出られる端点は一意に決まるので、
 出発点を決定した時点で、「$i$ 回目の移動後には、この連続する赤/青の区間のどこかに存在する」というのが決まってしまう。 出発点を決定した時点で、「$i$ 回目の移動後には、この連続する赤/青の区間のどこかに存在する」というのが決まってしまう。
  
行 236: 行 234:
                    ------     5ではこの上のどこかにいて、右端から出る                    ------     5ではこの上のどこかにいて、右端から出る
  
-赤が連続する区間は、どこかからの出発点で必ず通られる。+全ての赤が連続する区間は、どこかからの出発点で必ず通られる。
  
 よって、円周上で赤が連続する箇所は全て、$S$ 上で'B'に挟まれた最も短い奇数個の'R'の個数を超えてはならない。 よって、円周上で赤が連続する箇所は全て、$S$ 上で'B'に挟まれた最も短い奇数個の'R'の個数を超えてはならない。
行 288: 行 286:
 $dp[N]$ まで埋めたら、回転のバリエーションを考える。本問題では、回転して同じになるものは区別する。 $dp[N]$ まで埋めたら、回転のバリエーションを考える。本問題では、回転して同じになるものは区別する。
  
-単純に直線を円周に当てはめる位置を $N$ 通りずらすので、$dp[N]$ を $N$ 倍すればよいなんてことにはならず、+単純に直線を円周に当てはめる位置を $N$ 通りずらすので、$dp[N]$ を $N$ 倍すればよい...なんてことにはならず、
 例えば「赤赤赤青赤赤赤青」などは半回転した結果が全く同じになるので、重複してしまう。 例えば「赤赤赤青赤赤赤青」などは半回転した結果が全く同じになるので、重複してしまう。
  
programming_algorithm/contest_history/atcoder/2019/0504_agc033.txt · 最終更新: 2019/05/10 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0