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
| constexpr int N = 50100;
int n, a[N][4], all, b[4], le[N], lesum, u[16][N], sum[16]; int c[16], us[16][N], usum[16][N], ans[N], pmx[N], smx[N]; signed main() { cin >> n; for(int i = 1; i <= n; i++) { for(int j = 0; j < 4; j++) { cin >> a[i][j]; all += a[i][j]; pmx[i] = max(pmx[i], a[i][j]); } smx[i] = pmx[i]; pmx[i] = max(pmx[i - 1], pmx[i]); } for(int i = n; i; i--) smx[i] = max(smx[i + 1], smx[i]); for(int j = 0; j < 4; j++) cin >> b[j], all += b[j]; all /= n; for(int i = 1; i <= n; i++) { le[i] = all; for(int j = 0; j < 4; j++) le[i] -= a[i][j]; lesum += le[i]; } for(int s = 0; s < 16; s++) { for(int i = 1; i <= n; i++) u[s][i] = le[i]; sum[s] = c[s] = 0; for(int j = 0; j < 4; j++) { if(s >> j & 1) { sum[s] += b[j]; } else { c[s]++; for(int i = 1; i <= n; i++) { u[s][i] += a[i][j]; } } } for(int i = 1; i <= n; i++) us[s][i] = u[s][i]; sort(us[s] + 1, us[s] + n + 1); usum[s][n + 1] = 0; for(int i = n; i; i--) { usum[s][i] = usum[s][i + 1] + us[s][i]; } } for(int i = 1; i <= n; i++) for(int j = 0; j < 4; j++) { int lo = max(pmx[i - 1], smx[i + 1]), hi = a[i][j] + min(le[i], b[j]), mid; auto calc = [&](int x) { int resmin = 1e9; for(int s = 0; s < 16; s++) { int id = upper_bound(us[s] + 1, us[s] + n + 1, c[s] * x) - us[s]; int res = (n - id + 1) * c[s] * x - usum[s][id]; assert(res <= 0); res += lesum; res += sum[s]; if(s >> j & 1) { res -= min(le[i], b[j]); } res -= le[i]; res -= min(0ll, c[s] * x - u[s][i]); resmin = min(resmin, res); } return resmin; }; while(lo < hi) { mid = lo + hi >> 1; if(calc(mid) == lesum - le[i]) hi = mid; else lo = mid + 1; } if(calc(lo) != lesum - le[i]) continue; int to = a[i][j] + min(le[i], b[j]); ans[i] = max(ans[i], to - lo); } for(int i = 1; i <= n; i++) cout << ans[i] << " \n"[i == n]; return 0; }
|