1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| #include <bits/stdc++.h> #define FOR(i, a, b) for (int i = a; i <= b; ++i) #define ROF(i, a, b) for (int i = a; i >= b; --i) #define all(x) x.begin(),x.end() #define deSpace(x) cerr<<x<<' ' #define deEnter(x) cerr<<x<<'\n'
using namespace std;
typedef unsigned long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef array<ll,3> arr; typedef double DB; const ll MAXN=static_cast<ll>(2e5)+10,MAXval=static_cast<ll>(1e18)+3;
ll N,M,A[5][MAXN]; struct Triple{ ll val,i,j,k; }; struct cmp{ bool operator()(const Triple &a,const Triple &b) const{ return a.val<b.val; } }; struct cmpSet{ bool operator()(const Triple &a,const Triple &b) const{ if(a.val!=b.val) return a.val<b.val; if(a.i!=b.i) return a.i<b.i; if(a.j!=b.j) return a.j<b.j; if(a.k!=b.k) return a.k<b.k; return false; } }; priority_queue<Triple,vector<Triple> ,cmp> pq; set<Triple,cmpSet> vis;
ll f(ll i,ll j,ll k){ ll res=0; res=A[1][i]*A[2][j]+A[1][i]*A[3][k]+A[2][j]*A[3][k]; return res; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>N>>M; FOR(i, 1, 3){ FOR(j,1,N){ cin>>A[i][j]; } sort(&A[i][1],&A[i][N+1],greater<ll>()); } ll rank=0; pq.push((Triple){f(1,1,1),1,1,1}); while(!pq.empty()){ ++rank; if(rank==M){ cout<<pq.top().val<<'\n'; return 0; } ll i=pq.top().i,j=pq.top().j,k=pq.top().k; pq.pop(); if(vis.find((Triple){f(i+1,j,k),i+1,j,k})==vis.end() && i+1<=N){ pq.push((Triple){f(i+1,j,k),i+1,j,k}); vis.insert((Triple){f(i+1,j,k),i+1,j,k}); } if(vis.find((Triple){f(i,j+1,k),i,j+1,k})==vis.end() && j+1<=N){ pq.push((Triple){f(i,j+1,k),i,j+1,k}); vis.insert((Triple){f(i,j+1,k),i,j+1,k}); } if(vis.find((Triple){f(i,j,k+1),i,j,k+1})==vis.end() && k+1<=N){ pq.push((Triple){f(i,j,k+1),i,j,k+1}); vis.insert((Triple){f(i,j,k+1),i,j,k+1}); } } return 0; }
|