質問編集履歴

1

参考にした他の人のコードを追記しました。

2020/01/08 12:12

投稿

goro_gnm
goro_gnm

スコア42

test CHANGED
File without changes
test CHANGED
@@ -139,3 +139,143 @@
139
139
  }
140
140
 
141
141
  ```
142
+
143
+
144
+
145
+ ### 参考にしたコード
146
+
147
+ ```
148
+
149
+ #include <iostream>
150
+
151
+ #include <algorithm>
152
+
153
+ #include <string>
154
+
155
+ #include <vector>
156
+
157
+ #include <cmath>
158
+
159
+ #include <map>
160
+
161
+ #include <queue>
162
+
163
+ #include <iomanip>
164
+
165
+ #include <set>
166
+
167
+ #include <tuple>
168
+
169
+ #define mkp make_pair
170
+
171
+ #define mkt make_tuple
172
+
173
+ #define rep(i,n) for(int i = 0; i < (n); ++i)
174
+
175
+ using namespace std;
176
+
177
+ typedef long long ll;
178
+
179
+ const ll MOD=1e9+7;
180
+
181
+
182
+
183
+ ll N,M;
184
+
185
+ vector<ll> A;
186
+
187
+
188
+
189
+ vector<ll> sum;
190
+
191
+
192
+
193
+ bool judge(ll lim){
194
+
195
+ ll res=0;
196
+
197
+ int itr=0;
198
+
199
+ for(int i=N-1;i>=0;i--){
200
+
201
+ while(itr<N&&A[i]+A[itr]>=lim){
202
+
203
+ itr++;
204
+
205
+ }
206
+
207
+ res+=itr;
208
+
209
+ }
210
+
211
+
212
+
213
+ if(res>=M) return true;
214
+
215
+ else return false;
216
+
217
+ }
218
+
219
+
220
+
221
+ int main(){
222
+
223
+ cin>>N>>M;
224
+
225
+ A.resize(N);
226
+
227
+ rep(i,N) cin>>A[i];
228
+
229
+
230
+
231
+ sort(A.rbegin(),A.rend());
232
+
233
+
234
+
235
+ sum.resize(N+1,0);
236
+
237
+ rep(i,N) sum[i+1]=sum[i]+A[i];
238
+
239
+
240
+
241
+ ll ok=0,ng=(A[0]*2+1)*M;
242
+
243
+ while(abs(ok-ng)>1){
244
+
245
+ ll mid=(ok+ng)/2;
246
+
247
+ if(judge(mid)) ok=mid;
248
+
249
+ else ng=mid;
250
+
251
+ }
252
+
253
+
254
+
255
+ ll ans=0;
256
+
257
+ ll itr=0;
258
+
259
+ ll num=0;
260
+
261
+ for(int i=N-1;i>=0;i--){
262
+
263
+ while(itr<N && A[i]+A[itr]>=ok) itr++;
264
+
265
+ ans+=A[i]*itr+sum[itr];
266
+
267
+ num+=itr;
268
+
269
+ }
270
+
271
+ ans-=ok*(num-M);
272
+
273
+ cout<<ans<<endl;
274
+
275
+
276
+
277
+ return 0;
278
+
279
+ }
280
+
281
+ ```