1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

0.はじめに

 体調の悪さの続く今日この頃。
 ABは順調にとけたけど、CはTLEがとれない・・・。
 いろんな工夫をしてもだめで、ちらっと見たDが解けそうだったので
 残り15分くらいなのに取り組んだところあっさりAC。
 順番間違えたと思いつつコンテスト終了。
 DのACが効きレートは-2の812と緑に残りました。

1. A - Hell, World!

 文字列の問題。
 Sをans変数に一文字ずつ移しつつ
 その途中でX文字目だけうつさないことで
 問題の条件をみたした形でansを出力して終了。

 https://atcoder.jp/contests/abc459/submissions/76028708

2.B - 459

 B問題にたまにある、面倒だけど、考え方はそれほど難しくはない問題。
 処理の前段で、a~zまでの対応する数字を辞書に登録し
 後は読み込んだ文字列毎に数字を検索し結合し
 出力して終了でACとなりました。

 https://atcoder.jp/contests/abc459/submissions/76037809

3.C - Drop Blocks

 TLEが消えずてこずった問題。
 結局コンテスト後解説を見、それでもわからず
 GEMINIに相談して、解説の意味を皿に解説してもらって
 やっと考え方が分かりました。
 【TLEが出てた考え方】
  1.以下を用意
   -1.現在の最低マス位置L
   -2.現在の最高マス位置H
   -3.マス毎のブロック数B(N個の配列)
   -4.ブロック数毎のマスの数M(300001個の配列)
  2.クエリー1の時
   -1.Bからマスxの増加前のブロック数nを取得
   -2.マス毎のブロック数B[x]に1加算
   -3.ブロック数毎のマスの数M[n]から1減算
   -4.ブロック数毎のマスの数M[n+1]に1加算
   -5.M[n]が0かつ、最低マス位置Lがnの時、最低マス位置Lを1加算
   -6.最高マス位置Hがnと同じとき、Hに1加算
  3.クエリー2の時
   -1.M[y+L]から、M[H]の値を加算して出力
  
 3の集計処理に時間がかかっているのは分かったのでMを辞書化したりと
 工夫しても時間があまり縮まりませんでした。

 コンテスト後解説を読み、改良しました。
  1-4.をブロック数以上のマスの数とする
  2-3.の減算は不要となる
  2-5.の最低マス位置の判定は、M[n]=Nとなる
  3-1.の集計は、単純にM[y+L]の出力となる
   →ただし、yの値が最大値の時を考慮し、Mを600000以上に拡張するか
    y+LがQ以上の時は0を出力とする等の処理が必要
  1-2.のHと2-6の処理は不要となる

 処理を引くことで高速化出来るという発想が新鮮でした。

 https://atcoder.jp/contests/abc459/submissions/76092439

4.D - Adjacent Distinct String

 なんとなく、Dにしては簡単な問題でした。
 以下方針で実装してACとなりました。
 ・文字ごとの出現数が、偶数の時はSの文字数を2で割った値、奇数の時は、Sの文字数を2で割った値+1、
  以内であれば、隣接しない文字列を作れる。
 ・回答用文字列は、出現数の降順で文字を準備しまず文字列の偶数位置を埋めていき、最後まで来たら
  奇数列を埋めていく事で作成可能
  例)aabbbccの場合b3、a2、c2、とし
   bをbbb**
   cをbbbc で偶数折り返し
     bcb
b*c
   aをbcbabacと埋めて完成

 【実装】
  1.Sをリストに入れカウンター関数で文字ごとの個数をカウントした辞書Cを作成
  2.Cを元にリストqに[カウンター数、文字]を格納し、降順にソート
  3.LにSの長さをセット
  4.Xにq[0]の内容をセット
  5.Lが奇数の時
   -1.L//2+1がX[0]以上の時
    -1.Yesを出力
    -2.jに0をセット
    -3.リストansに""をL個セット
    -4.(奇数列の埋め)以下iを0からLを超えないまで2ずつカウントアップして繰り返し
     -1.X[0]が0の時(次の文字に移る)
      -1.jに1加算
      -2.Xにq[j]をセット
     -2.ans[i]にX[1]をセット
     -3.X[0]から1減算
    -5.(偶数列の埋め)以下iを1からLを超えないまで2ずつカウントアップして繰り返し
     -1.X[0]が0の時(次の文字に移る)
      -1.jに1加算
      -2.Xにq[j]をセット
     -2.ans[i]にX[1]をセット
     -3.X[0]から1減算
    -6.ansを結合して出力
   -2.L//2+1がX[0]より小さい時
    -1.Noを出力
  6.Lが奇数の時
   -1.L//2がX[0]以上の時
    略)5-1-以下の処理と同じ
   -1.L//2がX[0]より小さい時
    -1.Noを出力

 なんとなく、偶数奇数の部分もいい感じにまとめられそうではありますが、
 まぁ、ACでした。

 https://atcoder.jp/contests/abc459/submissions/76085631

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?