質問編集履歴

5

urlの記載

2024/07/13 14:23

投稿

FIREMAX
FIREMAX

スコア5

test CHANGED
File without changes
test CHANGED
@@ -44,7 +44,10 @@
44
44
  }
45
45
  ```
46
46
  「競技プログラミングの鉄則 米田優峻[著]」3.3 しゃくとり法の問題A13から引用
47
-
47
+ 問題:
48
+ https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_m
49
+ 解答コード:
50
+ https://github.com/E869120/kyopro-tessoku/blob/main/codes/cpp/chap03/answer_A13.cpp
48
51
  ---
49
52
  私の考えではこのしゃくとり法の計算量は(forループの計算量(1)) * (最も内側のwhileのループの計算量(2))が(n - 1)*(n - ?)のような形になり、O(n^2)となるように思います。これは結局、(n - 1)*(n - ?)< n^2ってことで、だから、O(n^2)にはならず、O(n)だという話なのでしょうか?
50
53
 

4

問題文の訂正

2024/07/13 14:20

投稿

FIREMAX
FIREMAX

スコア5

test CHANGED
File without changes
test CHANGED
@@ -7,7 +7,7 @@
7
7
  https://paiza.hatenablog.com/entry/2015/01/21/%E3%80%90%E7%B4%AF%E7%A9%8D%E5%92%8C%E3%80%81%E3%81%97%E3%82%83%E3%81%8F%E3%81%A8%E3%82%8A%E6%B3%95%E3%80%91%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E3%82%82%E8%A7%A3%E3%82%8B%E3%82%A2%E3%83%AB%E3%82%B4
8
8
  https://qiita.com/drken/items/ecd1a472d3a0e7db8dce
9
9
  ## 自分で考えたこと(追記)
10
- 以下のコードは「N個の小さい順に並んだ整数A1, A2, A3,...,ANの中から2つの整数のペアを選ぶ方法の中から差がKとなる選び方は何通りあるか」という問題を解くコードです。
10
+ 以下のコードは「N個の小さい順に並んだ整数A1, A2, A3,...,ANの中から2つの整数のペアを選ぶ方法の中から差がK以下となる選び方は何通りあるか」という問題を解くコードです。
11
11
  <制約>
12
12
  ・1 <= N <= 100000
13
13
  ・1 <= K <= 10^9
@@ -43,11 +43,14 @@
43
43
  return 0;
44
44
  }
45
45
  ```
46
- ## 引用元
47
46
  「競技プログラミングの鉄則 米田優峻[著]」3.3 しゃくとり法の問題A13から引用
47
+
48
48
  ---
49
49
  私の考えではこのしゃくとり法の計算量は(forループの計算量(1)) * (最も内側のwhileのループの計算量(2))が(n - 1)*(n - ?)のような形になり、O(n^2)となるように思います。これは結局、(n - 1)*(n - ?)< n^2ってことで、だから、O(n^2)にはならず、O(n)だという話なのでしょうか?
50
+
51
+
50
52
  ---
51
53
  私の考えにどんな間違いがあるのか、なぜ計算量O(n)となるのかを教えてくださると幸いです。私自身混乱しているところも多くあると思いますので、そこも含めてご指摘お願いいたします。
52
54
 
53
55
 
56
+

3

引用元の明記

2024/07/13 14:17

投稿

FIREMAX
FIREMAX

スコア5

test CHANGED
File without changes
test CHANGED
@@ -43,6 +43,9 @@
43
43
  return 0;
44
44
  }
45
45
  ```
46
+ ## 引用元
47
+ 「競技プログラミングの鉄則 米田優峻[著]」3.3 しゃくとり法の問題A13から引用
48
+ ---
46
49
  私の考えではこのしゃくとり法の計算量は(forループの計算量(1)) * (最も内側のwhileのループの計算量(2))が(n - 1)*(n - ?)のような形になり、O(n^2)となるように思います。これは結局、(n - 1)*(n - ?)< n^2ってことで、だから、O(n^2)にはならず、O(n)だという話なのでしょうか?
47
50
  ---
48
51
  私の考えにどんな間違いがあるのか、なぜ計算量O(n)となるのかを教えてくださると幸いです。私自身混乱しているところも多くあると思いますので、そこも含めてご指摘お願いいたします。

2

実例となるコードを添付しました。

2024/07/12 12:32

投稿

FIREMAX
FIREMAX

スコア5

test CHANGED
File without changes
test CHANGED
@@ -7,8 +7,44 @@
7
7
  https://paiza.hatenablog.com/entry/2015/01/21/%E3%80%90%E7%B4%AF%E7%A9%8D%E5%92%8C%E3%80%81%E3%81%97%E3%82%83%E3%81%8F%E3%81%A8%E3%82%8A%E6%B3%95%E3%80%91%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E3%82%82%E8%A7%A3%E3%82%8B%E3%82%A2%E3%83%AB%E3%82%B4
8
8
  https://qiita.com/drken/items/ecd1a472d3a0e7db8dce
9
9
  ## 自分で考えたこと(追記)
10
- 最も内側プでn-1回以下操作が行われ、それ外側のループでn回実行すので、(n-1)*nより、私しゃくと法の計算量はO(n^2)だ考えてす。
10
+ 以下「N個の小さい順に並んだ整数A1, A2, A3,...,AN中から2つの整数のペア選ぶ方法中から差がKとな選び方何通あるか」という問題を解くコードです。
11
+ <制約>
12
+ ・1 <= N <= 100000
13
+ ・1 <= K <= 10^9
14
+ ・1 <= A1 < A2 < ... < AN <= 10^9
15
+ ```C++
16
+ #include <iostream>
17
+ using namespace std;
18
+
19
+ int N, K;
20
+ int A[100009], R[100009];
21
+
22
+ int main() {
23
+ // 入力
24
+ cin >> N >> K;
25
+ for (int i = 1; i <= N; i++) cin >> A[i];
26
+
27
+ // しゃくとり法
28
+ for (int i = 1; i <= N - 1; i++) { //---(1)
29
+ // スタート地点を決める
30
+ if (i == 1) R[i] = 1;
31
+ else R[i] = R[i - 1];
32
+
33
+ // ギリギリまで増やしていく
34
+ while (R[i] < N && A[R[i] + 1] - A[i] <= K) { //---(2)
35
+ R[i] += 1;
36
+ }
37
+ }
38
+
39
+ // 出力
40
+ long long Answer = 0;
41
+ for (int i = 1; i <= N - 1; i++) Answer += (R[i] - i);
42
+ cout << Answer << endl;
43
+ return 0;
44
+ }
45
+ ```
46
+ 私の考えではこのしゃくとり法の計算量は(forループの計算量(1)) * (最も内側のwhileのループの計算量(2))が(n - 1)*(n - ?)のような形になり、O(n^2)となるように思います。これは結局、(n - 1)*(n - ?)< n^2ってことで、だから、O(n^2)にはならず、O(n)だという話なのでしょうか?
11
47
  ---
12
- 初学者も分りやすく教えていたると幸いです。
48
+ 私の考えどんな間違いがあるの、なぜ計算量O(n)となるのかを教えてると幸いです。私自身混乱しているところも多くあると思いますので、そこも含めてご指摘お願いいたします。
13
49
 
14
50
 

1

自分で考えたことを追記

2024/07/12 09:13

投稿

FIREMAX
FIREMAX

スコア5

test CHANGED
File without changes
test CHANGED
@@ -6,6 +6,8 @@
6
6
  以下の2つのサイトの内容を読みましたが、私はしっかりと理解することができませんでした。
7
7
  https://paiza.hatenablog.com/entry/2015/01/21/%E3%80%90%E7%B4%AF%E7%A9%8D%E5%92%8C%E3%80%81%E3%81%97%E3%82%83%E3%81%8F%E3%81%A8%E3%82%8A%E6%B3%95%E3%80%91%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E3%82%82%E8%A7%A3%E3%82%8B%E3%82%A2%E3%83%AB%E3%82%B4
8
8
  https://qiita.com/drken/items/ecd1a472d3a0e7db8dce
9
+ ## 自分で考えたこと(追記)
10
+ 最も内側のループではn-1回以下の操作が行われ、それをその外側のループでn回実行するので、(n-1)*nより、私はしゃくとり法の計算量はO(n^2)だと考えています。
9
11
  ---
10
12
  初学者にも分かりやすく教えていただけると幸いです。
11
13