teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

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

2020/01/08 12:12

投稿

goro_gnm
goro_gnm

スコア42

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
  ```