#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD 1000000007
#define M(x) (x % MOD + MOD )%MOD
#define _mp make_pair
#define _pb push_back
#define ff first
#define ss second
ll mul( ll x, ll y)
{ ll ans= 1 ;
while ( y> 0 )
{ if ( y& 1 )
ans= ( ans* x) % MOD;
x= ( x* x) % MOD;
y/ = 2 ;
}
return ans;
} ;
//....................................................................................
ll a[ 1005 ] [ 1005 ] ,range[ 1005 ] ,c[ 1005 ] ,cnt[ 1005 ] ,vis[ 1005 ] ,Task[ 1005 ] [ 2 ] ,work[ 1005 ] [ 2 ] ;
double a1[ 1005 ] [ 1005 ] ;
void utility( int n,int m) {
cout << "Enter the co-Ordinates of the workers\n " ;
for ( int i= 1 ; i<= n; i++ )
for ( int j= 0 ; j< 2 ; j++ )
{
cin >> work[ i] [ j] ;
}
cout << "Enter the co-Ordinates of the Task\n " ;
for ( int i= 1 ; i<= m; i++ )
for ( int j= 0 ; j< 2 ; j++ )
{
cin >> Task[ i] [ j] ;
}
double k;
for ( int i= 1 ; i<= n; i++ )
for ( int j= 1 ; j<= m; j++ )
{
k= sqrt ( pow ( ( Task[ j] [ 1 ] - work[ i] [ 1 ] ) ,2 ) + pow ( ( Task[ j] [ 0 ] - work[ i] [ 0 ] ) ,2 ) ) ;
a1[ i] [ j] = k;
//cout<<k<<"\n";
}
cout << "Enter the Range of the Workers\n " ;
for ( int i= 1 ; i<= n; i++ )
cin >> range[ i] ;
}
int main( )
{ ll val,n,m,i,j; // n is no. of workers , m is no. of tasks
cout << "Enter no. of workers and no. of tasks ->\n " ;
cin >> n>> m;
utility( n,m) ;
cout << "Enter the utility table for each worker ->\n " ;
for ( i= 1 ; i<= n; i++ )
for ( j= 1 ; j<= m; j++ )
cin >> a[ i] [ j] ; // utility of a task by a specific worker
//cout<<"Enter the task access table for each worker ->\n";
// for(i=1;i<=n;i++){
// for(j=1;j<=m;j++)
// { if (a1[i][j]<=range[i])
// val=1;
// else
// val=0;
// cout <<val<<" ";
// if(val==0)
// a[i][j]=-1;
// }
// cout<<"\n";
// }
cout << "Enter the capacity of each worker ->\n " ;
for ( i= 1 ; i<= n; i++ )
cin >> c[ i] ;
cout << "Optimised value will be ->\n " ;
vector< set< pair< ll,ll> > > v( 1005 ) ;
for ( i= 1 ; i<= m; i++ )
for ( j= 1 ; j<= n; j++ )
if ( a[ j] [ i] ! = - 1 )
v[ i] .insert ( _mp( a[ j] [ i] ,j) ) ;
ll ans= 0 ;
pair< ll,ll> p;
vector< set< pair< ll,ll> > > vv( 1005 ) ;
for ( i= 1 ; i<= m; i++ )
{ if ( ! v[ i] .empty ( ) )
{ p= * v[ i] .rbegin ( ) ;
v[ i] .erase ( p) ;
ans+ = p.ff ;
++ cnt[ p.ss ] ;
vv[ p.ss ] .insert ( _mp( p.ff ,i) ) ;
}
}
for ( i= 1 ; i<= n; i++ )
while ( cnt[ i] > c[ i] )
{ p= * vv[ i] .begin ( ) ;
ans- = p.ff ;
vv[ i] .erase ( p) ;
vis[ p.ss ] = 1 ;
-- cnt[ i] ;
}
for ( i= 1 ; i<= m; i++ )
if ( vis[ i] == 1 )
{ while ( ! v[ i] .empty ( ) )
{ p= * v[ i] .rbegin ( ) ;
v[ i] .erase ( p) ;
if ( cnt[ p.ss ] < c[ p.ss ] )
{ ++ cnt[ p.ss ] ;
ans+ = p.ff ;
break ;
}
}
}
cout << ans;
return 0 ;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCBsb25nIGxvbmcgaW50CiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBNKHgpICh4ICUgTU9EICsgTU9EICklTU9ECiNkZWZpbmUgX21wIG1ha2VfcGFpcgojZGVmaW5lIF9wYiBwdXNoX2JhY2sKI2RlZmluZSBmZiBmaXJzdAojZGVmaW5lIHNzIHNlY29uZAogCmxsIG11bCggbGwgeCwgbGwgeSkKeyBsbCBhbnM9MTsKICB3aGlsZSh5PjApCiAgeyBpZih5JjEpCiAgCWFucz0oYW5zKngpJU1PRDsKICAJeD0oeCp4KSVNT0Q7CiAgCXkvPTI7CiAgfQogCiAgICByZXR1cm4gYW5zOwp9OwogCi8vLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmxsIGFbMTAwNV1bMTAwNV0scmFuZ2VbMTAwNV0sY1sxMDA1XSxjbnRbMTAwNV0sdmlzWzEwMDVdLFRhc2tbMTAwNV1bMl0sd29ya1sxMDA1XVsyXTsKZG91YmxlIGExWzEwMDVdWzEwMDVdOwp2b2lkIHV0aWxpdHkoaW50IG4saW50IG0pewoJY291dDw8IkVudGVyIHRoZSBjby1PcmRpbmF0ZXMgb2YgdGhlIHdvcmtlcnNcbiI7Cglmb3IgKGludCBpPTE7aTw9bjtpKyspCgkJZm9yIChpbnQgaj0wO2o8MjtqKyspCgkJCXsKCQkJCWNpbj4+d29ya1tpXVtqXTsJCQkKCQkJfQoJY291dDw8IkVudGVyIHRoZSBjby1PcmRpbmF0ZXMgb2YgdGhlIFRhc2tcbiI7Cglmb3IgKGludCBpPTE7aTw9bTtpKyspCgkJZm9yIChpbnQgaj0wO2o8MjtqKyspCgkJCXsKCQkJCWNpbj4+VGFza1tpXVtqXTsJCQkKCQkJfQoJZG91YmxlIGs7CQoJZm9yKGludCBpPTE7aTw9bjtpKyspCglmb3IoaW50IGo9MTtqPD1tO2orKykKCXsKCQlrPXNxcnQocG93KChUYXNrW2pdWzFdLXdvcmtbaV1bMV0pLDIpK3BvdygoVGFza1tqXVswXS13b3JrW2ldWzBdKSwyKSk7CgkJYTFbaV1bal09azsKCQkvL2NvdXQ8PGs8PCJcbiI7CQoJfQoJY291dDw8IkVudGVyIHRoZSBSYW5nZSBvZiB0aGUgV29ya2Vyc1xuIjsKCWZvcihpbnQgaT0xO2k8PW47aSsrKQoJY2luPj5yYW5nZVtpXTsKIAp9CiAKaW50IG1haW4oKQp7ICAgbGwgdmFsLG4sbSxpLGo7ICAvLyBuIGlzIG5vLiBvZiB3b3JrZXJzICwgbSBpcyBuby4gb2YgdGFza3MKICAgIGNvdXQ8PCJFbnRlciBuby4gb2Ygd29ya2VycyBhbmQgbm8uIG9mIHRhc2tzIC0+XG4iOwoJY2luPj5uPj5tOwogCiAKCXV0aWxpdHkobixtKTsJCgljb3V0PDwiRW50ZXIgdGhlIHV0aWxpdHkgdGFibGUgZm9yIGVhY2ggd29ya2VyIC0+XG4iOwkKCWZvcihpPTE7aTw9bjtpKyspCglmb3Ioaj0xO2o8PW07aisrKQoJY2luPj5hW2ldW2pdOyAgLy8gIHV0aWxpdHkgb2YgYSB0YXNrIGJ5IGEgc3BlY2lmaWMgd29ya2VyCiAKCS8vY291dDw8IkVudGVyIHRoZSB0YXNrIGFjY2VzcyB0YWJsZSBmb3IgZWFjaCB3b3JrZXIgLT5cbiI7Ci8vCWZvcihpPTE7aTw9bjtpKyspewovLwlmb3Ioaj0xO2o8PW07aisrKQovLwl7IGlmIChhMVtpXVtqXTw9cmFuZ2VbaV0pCi8vCQl2YWw9MTsKLy8JCWVsc2UgCi8vCQl2YWw9MDsKLy8JY291dCA8PHZhbDw8IiAiOwovLwkgIGlmKHZhbD09MCkKLy8JICBhW2ldW2pdPS0xOyAgIAkKLy8JfQovLwljb3V0PDwiXG4iOwovLwl9ICAgICAgICAgICAgCiAKCWNvdXQ8PCJFbnRlciB0aGUgY2FwYWNpdHkgb2YgZWFjaCB3b3JrZXIgLT5cbiI7Cglmb3IoaT0xO2k8PW47aSsrKQoJY2luPj5jW2ldOwogCgljb3V0PDwiT3B0aW1pc2VkIHZhbHVlIHdpbGwgYmUgLT5cbiI7Cgl2ZWN0b3I8c2V0PHBhaXI8bGwsbGw+ID4gID4gdigxMDA1KTsKIAoJZm9yKGk9MTtpPD1tO2krKykKCWZvcihqPTE7ajw9bjtqKyspCglpZihhW2pdW2ldIT0tMSkKCXZbaV0uaW5zZXJ0KF9tcChhW2pdW2ldLGopKTsKIAoJbGwgYW5zPTA7CglwYWlyPGxsLGxsPiBwOwogCgl2ZWN0b3I8c2V0PHBhaXI8bGwsbGw+ID4gPiB2digxMDA1KTsKIAogICAgZm9yKGk9MTtpPD1tO2krKykKCXsgaWYoIXZbaV0uZW1wdHkoKSkKCSAgeyBwPSp2W2ldLnJiZWdpbigpOwoJICAJdltpXS5lcmFzZShwKTsKCSAgICBhbnMrPXAuZmY7CgkgICAgKytjbnRbcC5zc107CgkgICAgdnZbcC5zc10uaW5zZXJ0KF9tcChwLmZmLGkpKTsKCSAgfQoJfQogCglmb3IoaT0xO2k8PW47aSsrKQoJd2hpbGUoY250W2ldPmNbaV0pCgl7IHA9KnZ2W2ldLmJlZ2luKCk7CgkgIGFucy09cC5mZjsKCSAgdnZbaV0uZXJhc2UocCk7CgkgIHZpc1twLnNzXT0xOwoJICAtLWNudFtpXTsJCgl9CiAKCWZvcihpPTE7aTw9bTtpKyspCglpZih2aXNbaV09PTEpCgl7IHdoaWxlKCF2W2ldLmVtcHR5KCkpCgkgIHsgcD0qdltpXS5yYmVnaW4oKTsKCSAgCXZbaV0uZXJhc2UocCk7CiAKCSAgCWlmKGNudFtwLnNzXTxjW3Auc3NdKQoJICAJeyArK2NudFtwLnNzXTsKCSAgCSAgYW5zKz1wLmZmOwkKCQkgIGJyZWFrOyAKCQl9CgkgIH0JCgl9CiAKCWNvdXQ8PGFuczsJIAoJcmV0dXJuIDA7Cn0=