Untitled
user_0483151
plain_text
9 months ago
3.2 kB
12
Indexable
#include <bits/stdc++.h>
#define fi first
#define se second
#define bit(x, i) ( (( x ) >> ( i ) ) & 1 )
#define mask(i) ((1LL) << (i))
#define all(v) v.begin(), v.end()
#define cook '\n'
#define Task "energy"
using namespace std ;
const int dx[] = {1, 0, -1, 0} ;
const int dy[] = {0, 1, 0, -1} ;
const int mod = 1e9 + 7 ;
const int maxn = 1005 ;
struct Coor {
int x, y, z, power ;
Coor ( int _x = 0, int _y = 0, int _z = 0, int _power = 0 ) {
x = _x; y = _y; z = _z ; power = _power ;
}
};
int numPoint, numSource ;
Coor pos[maxn] ;
vector<int> type1, type2 ;
void inp() {
cin >> numPoint >> numSource ;
for ( int i = 1; i <= numPoint; i++ ) {
int x, y, z, power; cin >> x >> y >> z >> power ;
pos[i] = Coor(x, y, z, power) ;
if ( (x + y + z) & 1 ) type1.push_back(i) ;
else type2.push_back(i) ;
}
}
int seen[maxn], interation = 0;
int MatchL[maxn], MatchR[maxn] ;
int dis(int i, int j) {
return abs(pos[i].x - pos[j].x) + abs(pos[i].y - pos[j].y) + abs(pos[i].z - pos[j].z) ;
}
bool valid(int u, int i, int cur) {
return ( dis(u, i) == 1 && ( pos[u].power + pos[i].power ) >= cur ) ;
}
bool findOther(int u, int cur) {
if ( seen[u] == interation ) return false ;
seen[u] = interation ;
for ( int i : type2 ) {
if ( valid(u, i, cur) == true && ( MatchL[i] == -1 || findOther(MatchL[i], cur) == true ) ) {
MatchL[i] = u ;
MatchR[u] = i ;
return true;
}
}
return false ;
}
bool check(int lowest) {
for ( int i = 1; i <= numPoint; i++ ) MatchL[i] = MatchR[i] = -1 ;
for ( int u : type1 ) {
++interation ;
findOther(u, lowest) ;
}
int cnt_valid = 0 ;
for ( int i : type1 ) cnt_valid += ( MatchR[i] != -1 ) ;
if ( cnt_valid > numSource ) return false ;
for ( int i : type1 ) if ( MatchR[i] == -1 ) {
if ( pos[i].power >= lowest ) cnt_valid++ ;
else {
bool ok = false ;
for ( int j : type2 )
if ( valid(i, j, lowest) == true ) {
cnt_valid++ ;
ok = true ; break ;
}
if ( ok == false ) return false ;
}
}
for ( int i : type2 ) if ( MatchL[i] == -1 ) {
if ( pos[i].power >= lowest ) cnt_valid++ ;
else {
bool ok = false ;
for ( int j : type1 )
if ( valid(i, j, lowest) == true ) {
cnt_valid++ ;
ok = true ; break ;
}
if ( ok == false ) return false ;
}
}
return cnt_valid <= numSource ;
}
signed main() {
ios_base::sync_with_stdio(0) ;
cin.tie(nullptr) ;
if ( fopen(Task".inp", "r") ) {
freopen(Task".inp", "r", stdin) ;
freopen(Task".out", "w", stdout) ;
}
inp() ;
int L = 1, R = 2e9, ans = -1 ;
while ( R - L >= 0 ) {
int M = ( R - L ) / 2 + L ;
if ( check(M) == true ) {
ans = M ; L = M + 1 ;
} else R = M - 1 ;
}
cout << ans ;
}
Editor is loading...
Leave a Comment