F
ABC391F
解法
priority queue を用いて解く. 実際に候補を列挙していけばよい. 重複した \(\ (i,j,k)\ \) の組を調べないために,used 変数を用意しても良いが,別の解決策がある. Path が一意に定まれば良いので,
- \(j\) の遷移は \(i = 0\) のときのみ,
- \(k\) の遷移は \(i = 0\) かつ \(j = 0\) のときのみ,
とすれば良い.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"
int main() {
ll n,K;
cin >> n >> K;
vll a(n); rep(i,n) { cin >> a[i]; }
vll b(n); rep(i,n) { cin >> b[i]; }
vll c(n); rep(i,n) { cin >> c[i]; }
sort(rall(a));
sort(rall(b));
sort(rall(c));
using T = tuple<ll,ll,ll,ll>;
// set<tuple<ll,ll,ll>> used;
priority_queue<T> pq;
auto push = [&](ll i, ll j, ll k) -> void {
// if(pq.size() >= K) return; // WA
if(!in(i,n)) return;
if(!in(j,n)) return;
if(!in(k,n)) return;
// if(in({i,j,k}, used)) return;
ll val = a[i]*b[j] + b[j]*c[k] + c[k]*a[i];
pq.push({val,i,j,k});
// used.insert({i,j,k});
};
push(0, 0, 0);
ll ans;
rep(_ki, K){
auto [val,i,j,k] = pq.top(); pq.pop();
ans = val;
push(i+1, j, k);
if(i==0) push(i, j+1, k);
if(i==0 && j==0) push(i, j, k+1);
}
cout << ans << endl;
return 0;
}