| 比赛 | 不平凡的世界 | 评测结果 | AAAAAAAAAA | 
    | 题目名称 | 不平凡的boss | 最终得分 | 100 | 
    | 用户昵称 | ---- | 运行时间 | 2.328 s | 
    | 代码语言 | C++ | 内存使用 | 8.61 MiB | 
    | 提交时间 | 2015-11-05 10:14:25 | 
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int maxn = 102333;
struct D { int x, y, z; } in[maxn];
inline bool operator<(const D&a, const D&b) { return a.x < b.x; }
typedef long long int i64;
template<class T> inline void mint(T& a, T b) { if (a > b) a = b; }
template<class T> inline void maxt(T& a, T b) { if (a < b) a = b; }
const int maxsgt = 262144;
struct MM 
{
    int disc[maxn * 3], cd;
    int SGT[maxsgt << 1];
    inline int query(int l, int r)
    {
        l += maxsgt - 1, r += maxsgt + 1;
        int ans = 0;
        while (l ^ r ^ 1)
        {
            if (~l & 1) maxt(ans, SGT[l ^ 1]); 
            if (r & 1) maxt(ans, SGT[r ^ 1]);
            l >>= 1; r >>= 1;
        }
        return ans;
    }
    inline void alt(int p, int v) 
    { 
        for (maxt(SGT[p += maxsgt], v); p >>= 1 ;)
            SGT[p] = max(SGT[p << 1], SGT[p << 1 | 1]);
    }
    int cur; i64  cans;
    inline void add(int a, int b)
    {
        int ra = lower_bound(disc, disc + cd, a) - disc;
        alt(ra, b); 
        cans = disc[cur] + query(cur + 1, cd);
        if (ra <= cur) return;
        for (; ra < cd; ++ra)
        {
            i64 ss = disc[ra] + query(ra + 1, cd);
            if (ss <= cans ) cur = ra, cans = ss;
            else break;
        }
    }
} QA, QB;
pair<int, int> tt[maxn]; int ct;
inline i64 baoli()
{
    sort(tt, tt + ct);
    i64 ans = tt[ct - 1].first, cmt = 0;;
    for (int i = ct - 1; i > 0; --i)
    {
        maxt(cmt, (i64)tt[i].second);
        mint(ans, tt[i - 1].first + cmt);
    }
    maxt(cmt, (i64)tt[0].second); mint(ans, cmt);
    return ans;
}
int main()
{
    freopen("playwithboss.in", "r", stdin);
    freopen("playwithboss.out", "w", stdout);
    int n; scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d%d%d", &in[i].x, &in[i].y, &in[i].z);
    sort(in + 1, in + n + 1); 
    QA.disc[QA.cd++] = 0; QB.disc[QB.cd++] = 0;
    for (int i = 1; i <= n; ++i)  QA.disc[QA.cd++] = in[i].y;
    sort(QA.disc, QA.disc + QA.cd); QA.cd = unique(QA.disc, QA.disc + QA.cd) - QA.disc;
    for (int i = 1; i <= n; ++i)  QB.disc[QB.cd++] = in[i].z;
    sort(QB.disc, QB.disc + QB.cd); QB.cd = unique(QB.disc, QB.disc + QB.cd) - QB.disc;
    i64 ans = in[n].x;
    for (int i = n; i > 0; --i)
    {
        QA.add(in[i].y, in[i].z);
        QB.add(in[i].z, in[i].y);
        //tt[ct++] = make_pair(in[i].y, in[i].z);
        //assert(baoli() == min(QA.cans, QB.cans));
        mint(ans, min(QA.cans, QB.cans) + in[i - 1].x);
    }
    printf("%lld\n", ans);
}