質問編集履歴
1
参考にした他の人のコードを追記しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -68,4 +68,74 @@
|
|
68
68
|
}
|
69
69
|
cout << ans << endl;
|
70
70
|
}
|
71
|
+
```
|
72
|
+
|
73
|
+
### 参考にしたコード
|
74
|
+
```
|
75
|
+
#include <iostream>
|
76
|
+
#include <algorithm>
|
77
|
+
#include <string>
|
78
|
+
#include <vector>
|
79
|
+
#include <cmath>
|
80
|
+
#include <map>
|
81
|
+
#include <queue>
|
82
|
+
#include <iomanip>
|
83
|
+
#include <set>
|
84
|
+
#include <tuple>
|
85
|
+
#define mkp make_pair
|
86
|
+
#define mkt make_tuple
|
87
|
+
#define rep(i,n) for(int i = 0; i < (n); ++i)
|
88
|
+
using namespace std;
|
89
|
+
typedef long long ll;
|
90
|
+
const ll MOD=1e9+7;
|
91
|
+
|
92
|
+
ll N,M;
|
93
|
+
vector<ll> A;
|
94
|
+
|
95
|
+
vector<ll> sum;
|
96
|
+
|
97
|
+
bool judge(ll lim){
|
98
|
+
ll res=0;
|
99
|
+
int itr=0;
|
100
|
+
for(int i=N-1;i>=0;i--){
|
101
|
+
while(itr<N&&A[i]+A[itr]>=lim){
|
102
|
+
itr++;
|
103
|
+
}
|
104
|
+
res+=itr;
|
105
|
+
}
|
106
|
+
|
107
|
+
if(res>=M) return true;
|
108
|
+
else return false;
|
109
|
+
}
|
110
|
+
|
111
|
+
int main(){
|
112
|
+
cin>>N>>M;
|
113
|
+
A.resize(N);
|
114
|
+
rep(i,N) cin>>A[i];
|
115
|
+
|
116
|
+
sort(A.rbegin(),A.rend());
|
117
|
+
|
118
|
+
sum.resize(N+1,0);
|
119
|
+
rep(i,N) sum[i+1]=sum[i]+A[i];
|
120
|
+
|
121
|
+
ll ok=0,ng=(A[0]*2+1)*M;
|
122
|
+
while(abs(ok-ng)>1){
|
123
|
+
ll mid=(ok+ng)/2;
|
124
|
+
if(judge(mid)) ok=mid;
|
125
|
+
else ng=mid;
|
126
|
+
}
|
127
|
+
|
128
|
+
ll ans=0;
|
129
|
+
ll itr=0;
|
130
|
+
ll num=0;
|
131
|
+
for(int i=N-1;i>=0;i--){
|
132
|
+
while(itr<N && A[i]+A[itr]>=ok) itr++;
|
133
|
+
ans+=A[i]*itr+sum[itr];
|
134
|
+
num+=itr;
|
135
|
+
}
|
136
|
+
ans-=ok*(num-M);
|
137
|
+
cout<<ans<<endl;
|
138
|
+
|
139
|
+
return 0;
|
140
|
+
}
|
71
141
|
```
|