题解 | #【模板】整数域三分#
【模板】整数域三分
https://www.nowcoder.com/practice/12e52f8182354b94b7ff4800dc1c0cfc
#include "bits/stdc++.h" using namespace std; #define int long long #define pb push_back #define endl "\n" #define x first #define y second #define PII pair<int,int> #define PIII pair<int,PII> const int MOD = 1e9 + 7; const int N = 3e5; void slu() { int n, l, r; cin >> n >> l >> r; vector<int> k(n); vector<int> a(n); vector<int> b(n); for (int i = 0; i < n; i++)cin >> k[i] >> a[i] >> b[i]; int t1 = 0, t2 = 0; for (int i = 0; i < n; i++) t1 += abs(k[i] * l + a[i]) + b[i], t2 += abs(k[i] * r + a[i]) + b[i]; int Min = min(t1, t2); while (r - l > 10) { int dis = (r - l) / 3; int mid1 = l + dis; int mid2 = r - dis; int m1 = 0, m2 = 0; for (int i = 0; i < n; i++) m1 += abs(k[i] * mid1 + a[i]) + b[i], m2 += abs(k[i] * mid2 + a[i]) + b[i]; if (m1 < m2) r = mid2; else l = mid1; } for (int i = l; i <= r; i++) { int temp = 0; for (int j = 0; j < n; j++) temp += abs(k[j] * i + a[j]) + b[j]; Min = min(Min, temp); } cout << Min << endl; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T; cin >> T; // T = 1; while (T--)slu(); }