Over time, those coaches in BDN Collegiate Progranuning Contest split into two camps.The big danger is that, while optimists and pessimists battle it out, the environment of this area becomes ever more divided between universities with outstanding student resources surrounded by a vast neglected group of stagnation.
Amy and Bob, as the linchpins of these two camps respectively, decided to put the end to the rival. Now both camps hold nnn coders and nnn tea-bringers as the last resource on hand. They will form teams in pair that each team should consist of a coder and a tea-bringer. The power of a team is regarded as the sum of powers of both members.
Now Bob hired a spy and has got some information about the plan of his rival: the power of each team which will present for the enemy camp, and the corresponding unit of reputations that Bob would gain after beating this team. Naturally, he hopes to make the best arrangement of teams in his camp for more reputations.
These two camps will have a collision soon, and their teams will fight one on one in random order. That is, we may have n!n!n! different situations appearing in this collision. A team would triumphantly return if it has a higher power. When two teams of the same power meet, the one led by Amy would beat the rival by a neck.
Can you calculate the maximum expected unit of reputations that Bob will gain? To make the answer be an integer, you are asked to multiply the answer by nnn and we guarantee that the expected number multiplied by nnn should always be an integer.
Input
The input contains five lines, and the first line is consist of an integer n (1≤n≤400)n~(1\le n \le 400)n (1≤n≤400).
The second line contains nnn integers a1,a2,⋯ ,ana_1,a_2,\cdots,a_na1,a2,⋯,an with −1018≤ai≤1018-10^{18}\leq a_i\leq 10^{18}−1018≤ai≤1018, indicating the powers of all the teams led by Amy.
The third line contains nnn integers p1,p2,⋯ ,pnp_1,p_2,\cdots,p_np1,p2,⋯,pn with 1≤pi≤100001\leq p_i\leq 100001≤pi≤10000, indicating the corresponding units of reputations that Bob would gain if these teams led by Amy are beaten.
The fourth line contains nnn integers b1,b2,⋯ ,bnb_1,b_2,\cdots,b_nb1,b2,⋯,bn with −1018≤bi≤1018-10^{18}\leq b_i\leq 10^{18}−1018≤bi≤1018, indicating the powers of all coders in the camp of Bob.
The last line contains nnn integers c1,c2,⋯ ,cnc_1,c_2,\cdots,c_nc1,c2,⋯,cn with −1018≤ci≤1018-10^{18}\leq c_i\leq 10^{18}−1018≤ci≤1018, indicating the powers of all tea-bringers in the camp of Bob.
Output
Output an integer in a single line indicating the maximum expected number of wins multiplied by nnn.
思路:这题km板子必须是n3的才能过
#include <iostream>
#include<stdio.h>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#define ll long long
using namespace std;
#define maxn 605
#define INF 0x3f3f3f3f
ll n, a[maxn],b[maxn],c[maxn],p[maxn];
ll w[maxn][maxn];
ll lx[maxn] , ly[maxn];
ll linker[maxn];
ll slack[maxn];
bool visy[maxn];
ll pre[maxn];
void bfs( ll k ){
ll x , y = 0 , yy = 0 , delta;
memset( pre , 0 , sizeof(pre) );
for( ll i = 1 ; i <= n ; i++ ) slack[i] = INF;
linker[y] = k;
while(1){
x = linker[y]; delta = INF; visy[y] = true;
for( ll i = 1 ; i <= n ;i++ ){
if( !visy[i] ){
if( slack[i] > lx[x] + ly[i] - w[x][i] ){
slack[i] = lx[x] + ly[i] - w[x][i];
pre[i] = y;
}
if( slack[i] < delta ) delta = slack[i] , yy = i ;
}
}
for( ll i = 0 ; i <= n ; i++ ){
if( visy[i] ) lx[linker[i]] -= delta , ly[i] += delta;
else slack[i] -= delta;
}
y = yy ;
if( linker[y] == -1 ) break;
}
while( y ) linker[y] = linker[pre[y]] , y = pre[y];
}
ll KM(){
memset( lx , 0 ,sizeof(lx) );
memset( ly , 0 ,sizeof(ly) );
memset( linker , -1, sizeof(linker) );
for( ll i = 1 ; i <= n ; i++ ){
memset( visy , false , sizeof(visy) );
bfs(i);
}
ll res = 0 ;
for( ll i = 1 ; i <= n ; i++ ){
if( linker[i] != -1 ){
res += w[linker[i]][i] ;
}
}
return res;
}
int main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
for(ll i=1;i<=n;i++) scanf("%lld",&p[i]);
for(ll i=1;i<=n;i++) scanf("%lld",&b[i]);
for(ll i=1;i<=n;i++) scanf("%lld",&c[i]);
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=n;j++)
{
ll s=0;
for(ll k=1;k<=n;k++)
{
if(b[i]+c[j]>a[k]) s+=p[k];
}
w[i][j]=s;
}
}
//printf("%lld\n",km());
printf("%lld\n",KM());
}