比赛 |
不平凡的世界 |
评测结果 |
AAAAAAAAAA |
题目名称 |
不平凡的boss |
最终得分 |
100 |
用户昵称 |
膜拜神犇王梦迪 |
运行时间 |
1.582 s |
代码语言 |
C++ |
内存使用 |
2.69 MiB |
提交时间 |
2015-11-05 11:49:04 |
显示代码纯文本
#include <algorithm>
#include <cstdio>
#include <queue>
#include <set>
using namespace std;
const int kN = 1e5+10;
const int INF = 1e9+10;
int N;
struct Mon {
int a, b, c;
bool operator < (const Mon & m) const {
if (a != m.a) return a < m.a;
if (b != m.b) return b < m.b;
if (c != m.c) return c < m.c;
return false;
}
}mon[kN];
int renb[kN], tmpbcnt[kN];
struct Solver2 {
int bval[kN];
bool inq[kN];
set<int> q;
priority_queue<pair<int, pair<int, int> > > ans;
int find_pre(set<int>::iterator it) {
if (it == q.begin()) return 0;
--it;
return *it;
}
int find_suf(set<int>::iterator it) {
// printf("i = %d\n", *it);
++it;
if (it == q.end()) return 0;
// printf("suf = %d\n", *it);
return *it;
}
void insert(int a, int b) {
bval[a] = b;
set<int>::iterator ait = q.insert(a).first; inq[a] = true;
int r = find_suf(ait);
if (r && b <= bval[r]) {
inq[a] = false;
q.erase(ait);
return;
}
int l = find_pre(ait);
while (l && bval[l] <= b) {
inq[l] = false;
q.erase(q.find(l));
l = find_pre(ait);
}
ans.push(make_pair(-(renb[l]+bval[a]), make_pair(l, a)));
ans.push(make_pair(-(renb[a]+bval[r]), make_pair(a, r)));
}
int get() {
while(true) {
pair<int, pair<int, int> > t = ans.top();
int ret = t.first, i = t.second.first, j = t.second.second;
// printf("find_suf[%d] = %d\n", i, find_suf(q.find(i)));
if (inq[i] && inq[j] && find_suf(q.find(i)) == j) {
return -ret;
} else {
ans.pop();
}
}
}
}sol2;
int main() {
freopen("playwithboss.in", "r", stdin);
freopen("playwithboss.out", "w", stdout);
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
scanf("%d %d %d", &mon[i].a, &mon[i].b, &mon[i].c);
renb[i] = mon[i].b;
}
sort(renb+1, renb+1+N);
for (int i = 1; i <= N; i++) {
mon[i].b = lower_bound(renb+1, renb+1+N, mon[i].b) - renb;
if (tmpbcnt[mon[i].b]) mon[i].b = ++tmpbcnt[mon[i].b];
else tmpbcnt[mon[i].b] = mon[i].b;
}
sort(mon+1, mon+1+N);
sol2.insert(0, INF);
sol2.insert(N+1, 0);
int ans = mon[N].a;
for (int i = N; i >= 1; i--) {
sol2.insert(mon[i].b, mon[i].c);
ans = min(ans, mon[i-1].a + sol2.get());
}
printf("%d\n", ans);
return 0;
}