回答編集履歴

1

補足

2020/01/08 13:54

投稿

yudedako67
yudedako67

スコア2047

test CHANGED
@@ -49,3 +49,51 @@
49
49
 
50
50
 
51
51
  そのほかにも配列の範囲外へのアクセスがあるのと、M回を超えて握手する可能性があります(done > M)。テストケースによってはWAになるでしょう。
52
+
53
+
54
+
55
+ ---
56
+
57
+ 参考コードとの比較
58
+
59
+ ```C++
60
+
61
+ int itr=0;
62
+
63
+ for(int i=N-1;i>=0;i--){
64
+
65
+ while(itr<N&&A[i]+A[itr]>=lim){
66
+
67
+ itr++;
68
+
69
+ }
70
+
71
+ res+=itr;
72
+
73
+ }
74
+
75
+ ```
76
+
77
+ こちらのコードの場合、itrの初期化位置がforループの外なので、次のiの計算でも前のitrがそのまま残った状態です。itrは増える一方で、最大Nまでインクリメントされるだけなので、whileループの中は高々N回しか呼ばれません。結果計算量はO(N)になります。
78
+
79
+
80
+
81
+ ```C++
82
+
83
+ ll itr=0;
84
+
85
+ ll num=0;
86
+
87
+ for(int i=N-1;i>=0;i--){
88
+
89
+ while(itr<N && A[i]+A[itr]>=ok) itr++;
90
+
91
+ ans+=A[i]*itr+sum[itr];
92
+
93
+ num+=itr;
94
+
95
+ }
96
+
97
+ ```
98
+
99
+ こちらも同様にitrがインクリメントされるのは高々N回なのでO(N)です。