結果
| 問題 |
No.618 labo-index
|
| コンテスト | |
| ユーザー |
n_knuu
|
| 提出日時 | 2017-11-27 03:02:34 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 175 ms / 6,000 ms |
| コード長 | 2,214 bytes |
| コンパイル時間 | 2,693 ms |
| コンパイル使用メモリ | 239,016 KB |
| 最終ジャッジ日時 | 2025-01-05 04:29:54 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 35 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:28:15: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
28 | int Q; scanf("%d", &Q);
| ~~~~~^~~~~~~~~~
main.cpp:31:23: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
31 | int t; ll x; scanf("%d %lld", &t, &x);
| ~~~~~^~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
typedef pair<ll, ll> Pll;
typedef vector<int> Vi;
//typedef tuple<int, int, int> T;
#define FOR(i,s,x) for(int i=s;i<(int)(x);i++)
#define REP(i,x) FOR(i,0,x)
#define ALL(c) c.begin(), c.end()
#define DUMP( x ) cerr << #x << " = " << ( x ) << endl
template<class T>
using indexed_set = tree<T,
null_type,
less<T>,
rb_tree_tag,
tree_order_statistics_node_update>;
const int dr[4] = {-1, 0, 1, 0};
const int dc[4] = {0, 1, 0, -1};
const ll INF = 1e18;
int main() {
int Q; scanf("%d", &Q);
vector<pair<int, int>> events;
REP(_, Q) {
int t; ll x; scanf("%d %lld", &t, &x);
events.emplace_back(t, x);
}
vector<ll> up_events(Q + 1, 0);
REP(i, Q) {
int t; ll x; tie(t, x) = events[i];
if (t == 3) up_events[i + 1] = x;
up_events[i + 1] += up_events[i];
}
vector<pair<ll, int>> final_powers;
REP(i, Q) {
int t; ll x; tie(t, x) = events[i];
if (t == 1) {
ll final_power = x + up_events[Q] - up_events[i];
final_powers.emplace_back(final_power, i);
}
}
sort(ALL(final_powers));
int N = final_powers.size();
vector<int> idx2tree(Q, -1);
REP(i, N) {
ll x; int idx; tie(x, idx) = final_powers[i];
idx2tree[idx] = i;
}
vector<int> labo_members;
indexed_set<int> idxset;
int prev = 0;
REP(q, Q) {
int t; ll x; tie(t, x) = events[q];
if (t == 1) {
idxset.insert(idx2tree[q]);
labo_members.emplace_back(q);
} else if (t == 2) {
x--;
idxset.erase(idx2tree[labo_members[(int)x]]);
}
int num_members = idxset.size();
int left = 0, right = num_members + 1;
while (left + 1 < right) {
int mid = (left + right) >> 1;
int idx = *idxset.find_by_order(num_members - mid);
ll orig = final_powers[idx].second;
ll now_power = events[orig].second + up_events[q + 1] - up_events[orig];
(now_power >= mid ? left : right) = mid;
}
printf("%d\n", left);
prev = left;
}
return 0;
}
n_knuu