結果
| 問題 |
No.433 ICPC国内予選の選抜ルールがこんな感じだったらうれしい
|
| コンテスト | |
| ユーザー |
nmnmnmnmnmnmnm
|
| 提出日時 | 2016-10-14 23:21:17 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 420 ms / 4,000 ms |
| コード長 | 2,739 bytes |
| コンパイル時間 | 1,157 ms |
| コンパイル使用メモリ | 95,892 KB |
| 実行使用メモリ | 11,472 KB |
| 最終ジャッジ日時 | 2024-11-22 10:26:28 |
| 合計ジャッジ時間 | 11,260 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 48 |
ソースコード
#include <algorithm>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <memory>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
#define sz size()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(c) (c).begin(), (c).end()
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
#define clr(a, b) memset((a), (b) ,sizeof(a))
#define ctos(c) string(1,c)
#define print(x) cout<<#x<<" = "<<x<<endl;
#define MOD 1000000007
#define A 1000000000000000LL
#define C 10000000LL
ll d1[100005];
ll d2[100005];
#define N_MAX (1<<17)
#define INF 100000000000000000LL
int nn_sst;
long long dat_sst1[(2 * N_MAX) - 1];
long long dat_sst2[(2 * N_MAX) - 1];
void init_sst(int n1) {
nn_sst = 1;
while (nn_sst < n1)nn_sst *= 2;
for (int i = 0; i < 2 * nn_sst - 1; i++) {
dat_sst1[i] = 0;
dat_sst2[i] = 0;
}
}
void add_sst(int a, int b, long long x, int k, int l, int r) {
if (r <= a || b <= l)return;
if (a <= l && r <= b) {
dat_sst2[k] += x;
return;
}
add_sst(a, b, x, k * 2 + 1, l, (l + r) / 2);
add_sst(a, b, x, k * 2 + 2, (l + r) / 2, r);
dat_sst1[k] = max(dat_sst1[k * 2 + 1] + dat_sst2[k * 2 + 1], dat_sst1[k * 2 + 2] + dat_sst2[k * 2 + 2]);
}
long long query_sst(int a, int b, int k, int l, int r) {
if (b <= l || r <= a)return -INF;
if (a <= l && r <= b) {
return (dat_sst1[k] + dat_sst2[k]);
}
else {
long long vl = query_sst(a, b, k * 2 + 1, l, (l + r) / 2);
long long vr = query_sst(a, b, k * 2 + 2, (l + r) / 2, r);
return max(vl, vr) + dat_sst2[k];
}
}
int main() {
ll n, k;
cin >> n >> k;
vector<pair<pair<ll, ll> , ll> > v;
rep(i, 0, n) {
ll a, b, c;
cin >> a >> b >> c;
a *= A;
b = 1000000 - b;
v.pb(mp(mp(c, a + 100000 * C + b), i));
}
sort(all(v));
rep(i, 0, 100005) {
d1[i] = C;
d2[i] = -C;
}
rep(i, 0, v.sz) {
d1[v[i].fi.fi] = min(d1[v[i].fi.fi], i);
d2[v[i].fi.fi] = max(d2[v[i].fi.fi], i);
}
init_sst(v.sz);
rep(i, 0, v.sz) {
add_sst(i, i + 1, v[i].fi.se, 0, 0, nn_sst);
}
ll index = 0;
rep(i, 0, v.sz) {
ll a = query_sst(0, n, 0, 0, nn_sst);
long long low = 0;
long long high = n - 1;
while (low < high) {
long long mid = (high + low) >> 1;
if (query_sst(0, mid + 1, 0, 0, nn_sst) == a) {
high = mid;
}
else {
low = mid + 1;
}
}
ll p = low;
cout << v[p].se << endl;
ll g = v[p].fi.fi;
add_sst(d1[g], d2[g] + 1, -1 * C, 0, 0, nn_sst);
add_sst(p, p + 1, -INF, 0, 0, nn_sst);
index++;
if (index == k)break;
}
return 0;
}
nmnmnmnmnmnmnm