0
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?

More than 1 year has passed since last update.

0.はじめに
 昨日は調子が悪かったので気を取り直してレギュラーコンテスト。
 A問題は解けましたが、B以降は解き方の考えがまとまりませんでした・・・。
 レートは微増でした。

1.A - Ekiden Race
 問題名が駅伝となっていたので、問題がすんなり理解できませんでした・・・。
 駅伝は忘れて取り組みました。
 
 考え方
  往路順位が最終順位より高いかつ、往路順位が自分以下な人に袋順位で抜かされていない人が
  区間賞を取っている可能性がある。
  注意点としては、以下のようなケースの場合
  2 1 4 3
  最終1位の人は、最終2位の人を抜かしているので
  区間賞の可能性があるが、最終3位の人も、1位の人に抜かれていないので
  区間賞の可能性があるということ。
  
 実装
  以下ケースごとの実装内容
  変数定義
   N:ケースごとの人数(入力値)
   P:順位リスト(入力値)
   Q:往路が下位の人に、復路で抜かれていないかを保持するリスト(初期値0)
     0(未チェック・抜かれていない) 1:抜かれたorチェック済
   chk:復路順位チェック用変数(初期値1)
   flg:抜かした人用ループフラグ(初期値0)
   ans:回答用変数(初期値0)
   i:抜かした人用ループ変数
   
   Q[1]に1(チェック済)をセット
   
  以下flgが0の間繰り返す
   -chk位の人が往路どの順位だったかを探す&抜かした人を抜かれた状態にする
   以下P[i]がchkと異なる間繰り返す
    Q[P[i]に1(抜かれた)をセット
     →最初のループ(1位の人を探すループ)時を例にとると
      最終順位1位より前にいる→往路で1位の人より先にいた→復路で抜かれた
    iに1を加算
   最終順位1の人は区間賞の可能性があるので、ansに1加算
   
   -次に探す順位を求める処理
   j:chk+1↑で調べた順位の次の順位をセット
   iに1を加算(次のループ時には今まで調べた往路順位移行から調べればよいため)
   flg2に0をセット:2個目のループ制御用
   以下、flg2が0の間実行
    jがNを超えた場合(全員チェックを終えた場合)
     flg2に1をセット
    Q[j]が0(未チェック&抜かされてない)の時
     Q[j]に1をセット→チェック対象とする
     flg2に1をセット
     chkにjをセット
    上記以外の場合
     jに1を加算
      
   -1週目のループ終了判定
    jがNを超えた場合
     flgに1をセット
     
  最後にansを出力して終了

 https://atcoder.jp/contests/arc162/submissions/42722070

以上

0
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
0
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?