Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using std::cerr;
- using std::endl;
- inline int rd() {
- int a = 1, b = 0; char c = getchar();
- while (!isdigit(c)) a = c == '-' ? 0 : 1, c = getchar();
- while (isdigit(c)) b = b * 10 + c - '0', c = getchar();
- return a ? b : -b;
- }
- const int N = 1e5 + 233;
- int n; long long f[N];
- struct Node {
- long long x, y, c;
- } R[N];
- inline bool comp(const Node &a, const Node &b) {
- return a.x + a.y < b.x + b.y;
- }
- inline long long cross(long long x, long long y) {
- return (x - y) * (x - y);
- }
- inline int find_pos(int x) {
- int l = 1, r = n, ret = 0;
- while (l <= r) {
- int mid = (l + r) >> 1;
- if (R[mid].x + R[mid].y <= x)
- ret = mid, l = mid + 1;
- else r = mid - 1;
- }
- return ret;
- }
- inline void solve() {
- n = rd();
- for (int i = 1; i <= n; ++i)
- R[i].x = rd(), R[i].y = rd(), R[i].c = rd();
- std::sort(R + 1, R + n + 1, comp);
- for (int i = 1; i <= n; ++i) {
- long long tmp = 4 * R[i].y * R[i].y - 4 * R[i].c * R[i].y;
- int st = find_pos(R[i].x - R[i].y);
- f[i] = f[st] + tmp;
- for (int j = std::max(1, i - 300); j < i; ++j)
- f[i] = std::max(f[i], f[j] + tmp - cross(R[j].x + R[j].y, R[i].x - R[i].y));
- f[i] = std::max(f[i], f[i - 1]);
- }
- long long ans = 0, yu = 0;
- for (int i = 1; i <= n; ++i)
- ans = std::max(ans, f[i]);
- long double out = ans;
- out = out / 4;
- printf("%.2Lf\n", out);
- printf("%lld\n", ans / 4);
- }
- int main() {
- // freopen("data", "r", stdin);
- // freopen("ex_radar.in", "r", stdin);
- int T = rd();
- while (T--)
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement