iroirohasu
@iroirohasu (iro hasu)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

競技プログラミングの問題理解について

Q&A

Closed

・質問
https://atcoder.jp/contests/abc152/tasks/abc152_c
この問題の解説を見たのですが、この問題を見て「前から見て自分が最小値か」を問われていると理解できません。自分の理解力がないだけですがわかりやすく教えていただけるとありがたいです。

....
問題文
1,…,N の順列P1,…,PNが与えられます。
​次の条件を満たす整数i(1≤i≤N)の個数を数えてください。
任意の整数
j(1≤j≤i) に対して、Pi≤Pj

制約
・1≤N≤2×10**5​
・P1,…,P Nは1,…,N の順列である
​・入力はすべて整数である。
....

0

3Answer

数学的に正確な文章って、理解するの難しいですよね。
まず大前提として「任意の」は「全ての」とほぼ同じ意味です。「任意の整数 j(1≤j≤i)」≒「1≤j≤iを満たすすべての整数j」ですね。

さて、AtCoderでは定数を大文字にしていますよね。今回の問題ですとNとPは定数(つまり、入力を受け取って以降は、変化しない数字)です。
ではiとjは? これらは変数、つまりプログラム内で変化する数字です。しかしながら、その役割は異なります。

iは「条件チェック時は定数」です。
つまり、「i=1の時、条件を満たすかな?」「i=2の時、条件を満たすかな」……というように、「i=1の時」「i=2の時」とiを固定して考えます。

例えば、i=5の時、「条件:任意の整数 j(1≤j≤i) に対して、Pi≤Pj」かどうかを検討したいとしましょう。
i=5と固定していますので、条件は「全ての整数j(1≤j≤5) に対してP5≤Pj」と言い換える事が出来ます。さらに言い換えると「P5≤P1かつP5≤P2かつP5≤P3かつP5≤P4かつP5≤P5」となります。
これってつまり、「P5はP1~P5の中で最小値かどうか」ですよね。

最後に、疑似コードを載せておきます。参考にして下さい。

//C言語っぽい疑似コード
bool check(const int i){
  //条件チェック時、iは固定されている。
  return 「すべてのj(1ji)について、PiPj?」;
}
int count(){
  int result = 0;
  for(int i=0;i<N; i++){
    //各iについて、条件をチェックする
    if(check(i))count++;
  }
  return count;
}
#Pythonっぽい疑似コード
def check(i):
    #条件チェック時、iは固定されている。
    return すべてのj(1ji)についてPiPj?」

def count():
    result=0
    for i in range(N):
        #各iについて、条件をチェックする
        if(check(i)):
            result+=1
    return result
5Like

Comments

  1. @iroirohasu

    Questioner

    コードまでありがとうございます!
    jを1からNまでの数と認識することで理解できました。
    ありがとうございました!

出題者はイジワルでは!主題はアルゴリズムを求めているなら?

さて、1≤N≤2×10**5​(20万) と2sec 1mbの制約からquick sort のような再帰定義を応用したアルゴリズムが勝敗を左右するのではと感じます。

 j(1≦j≦i)、Pi≦Pj のiとjが逆になっていますが、その法則から計算式が求められたら劇的に高速になるかも?

j(1≦j≦i)、Pj<Pi(逆) 成立で即count=0(棄却)でreturnでチョビット早い?

j(1≦j≦i)・・・for j in range(1, i+1):

全ての要素をloopするのではなく、範囲を限定できるか?  

for j in range(i+1, 1, -1): 逆の方が棄却率が高い?かも?
  

私には、全くわからない!

2Like

Comments

  1. @iroirohasu

    Questioner

    ありがとうございます!

The problem statement is asking to count the number of integers in a permutation of 1 to N, where for any integer j in the range 1 to i, the value of Pi is less than or equal to Pj. In simpler terms, it's asking to count the number of elements in the permutation that are the minimum value in the sequence starting from the front.
The input is a permutation of numbers 1 to N, and the output is the number of elements that are the minimum value in the sub-sequence starting from the front.

2Like

Comments

  1. @iroirohasu

    Questioner

    ありがとうございます!

Your answer might help someone💌