Submission #1263337

#TimeUsernameProblemLanguageResultExecution timeMemory
1263337chikien2009Team Contest (JOI22_team)C++20
0 / 100
40 ms22384 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

struct SEGMENT_TREE
{
    int mx[1200000], mn[1200000];
    inline SEGMENT_TREE()
    {
        fill_n(mx, 1200000, -1);
        fill_n(mn, 1200000, 1e9);
    }
    inline void Update(int ind, int l, int r, int x, int v)
    {
        if (r < x || x < l)
        {
            return;
        }
        if (l == r)
        {
            mx[ind] = max(mx[ind], v);
            mn[ind] = (mn[ind] == -1 ? -1 : min(mn[ind], v));
            return;
        }
        int m = (l + r) >> 1;
        Update(ind << 1, l, m, x, v);
        Update(ind << 1 | 1, m + 1, r, x, v);
        mx[ind] = max(mx[ind << 1], mx[ind << 1 | 1]);
        mn[ind] = min(mn[ind << 1], mn[ind << 1 | 1]);
    }
    inline int Get(int ind, int l, int r, int x, int y, int mode)
    {
        if (r < x || y < l)
        {
            return (mode ? 1000000000 : -1);
        }
        if (x <= l && r <= y)
        {
            return mx[ind];
        }
        int m = (l + r) >> 1;
        if (mode)
        {
            return min(Get(ind << 1, l, m, x, y, mode), Get(ind << 1 | 1, m + 1, r, x, y, mode));
        }
        return max(Get(ind << 1, l, m, x, y, mode), Get(ind << 1 | 1, m + 1, r, x, y, mode));
    }
} st1, st2;

int n, m, b[300000], c, d, l, r, mid, res = -1;
array<int, 3> a[150000];

int main()
{
    setup();

    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        cin >> a[i][0] >> a[i][1] >> a[i][2];
        b[i << 1] = a[i][1];
        b[i << 1 | 1] = a[i][2];
    }
    sort(a, a + n);
    sort(b, b + 2 * n);
    m = unique(b, b + 2 * n) - b;
    for (int i = 0, j = 0; i < n;)
    {
        while (j < n && a[i][0] == a[j][0])
        {
            a[j][1] = lower_bound(b, b + m, a[j][1]) - b;
            a[j][2] = lower_bound(b, b + m, a[j][2]) - b;
            l = a[j][1] + 1;
            r = m - 1;
            while (l <= r)
            {
                mid = (l + r) >> 1;
                d = st1.Get(1, 0, m - 1, mid, m - 1, 0);
                if (a[j][2] < d)
                {
                    l = mid + 1;
                    res = max(res, a[j][0] + b[mid] + b[d]);    
                }
                else
                {
                    r = mid - 1;
                }
            }
            j++;
        }
        while (i < j)
        {
            c = st2.Get(1, 0, m - 1, 0, a[i][1] - 1, 0);
            if (c != -1)
            {
                st1.Update(1, 0, m - 1, a[i][1], c);
            }
            c = -1;
            l = a[i][1] + 1;
            r = m - 1;
            while (l <= r)
            {
                mid = (l + r) >> 1;
                d = st2.Get(1, 0, m - 1, mid, m - 1, 1);
                if (d != -1 && a[i][2] > d)
                {
                    c = mid;
                    l = mid + 1;
                }
                else
                {
                    r = mid - 1;
                }
            }
            if (c != -1)
            {
                st1.Update(1, 0, m - 1, c, a[i][2]);
            }
            st2.Update(1, 0, m - 1, a[i][1], a[i][2]);
            i++;
        }
    }
    cout << res;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...