| 记录编号 |
612617 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
[统一省选 2020]冰火战士 |
最终得分 |
100 |
| 用户昵称 |
终焉折枝 |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
9.538 s |
| 提交时间 |
2026-02-24 19:14:33 |
内存使用 |
27.75 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 2 * 1e6 + 5;
ll t1[MAXN], t2[MAXN];
int lsh[MAXN], tot;
ll sum = 0;
struct node{
int op, t, x, y;
}q[MAXN];
int lowbit(int x){
return x & -x;
}
void add(ll *bit, int x, ll k){
// if(x <= 0) return;
while(x <= tot + 1){
bit[x] += k;
x += lowbit(x);
}
}
int Q;
int main(){
cin.tie(0) -> ios::sync_with_stdio(0);
cin >> Q;
for(int i = 1;i <= Q;i ++){
cin >> q[i].op;
if(q[i].op == 1){
cin >> q[i].t >> q[i].x >> q[i].y;
lsh[++ tot] = q[i].x;
}
else{
cin >> q[i].t;
}
}
sort(lsh + 1, lsh + tot + 1);
tot = unique(lsh + 1, lsh + tot + 1) - (lsh + 1);
for(int i = 1;i <= Q;i ++){
if(q[i].op == 1){
q[i].x = lower_bound(lsh + 1, lsh + tot + 1, q[i].x) - lsh;
}
}
for(int i = 1;i <= Q;i ++){
if(q[i].op == 1){
if(q[i].t == 0) add(t1, q[i].x, q[i].y);
else add(t2, q[i].x + 1, q[i].y), sum += q[i].y;
}
else{
if(q[q[i].t].t == 0) add(t1, q[q[i].t].x, -q[q[i].t].y);
else add(t2, q[q[i].t].x + 1, -q[q[i].t].y), sum -= q[q[i].t].y;
}
ll p1 = 0, s1 = 0, s2 = 0;
for(int j = 20;j >= 0;j --){
int nxt = p1 + (1 << j);
if(nxt <= tot && s1 + t1[nxt] < sum - (s2 + t2[nxt])){
p1 = nxt, s1 += t1[nxt], s2 += t2[nxt];
}
}
ll res1 = s1;
ll res2 = 0, p2 = 0;
if(p1 < tot){
ll ss1 = 0, ss2 = 0;
for(int j = p1 + 1;j;j -= lowbit(j)){
ss1 += t1[j], ss2 += t2[j];
}
res2 = sum - ss2;
if(res2 >= res1){
p2 = 0, ss2 = 0;
for(int j = 20;j >= 0;j --){
int nxt = p2 + (1 << j);
if(nxt <= tot && sum - (ss2 + t2[nxt]) >= res2){
p2 = nxt;
ss2 += t2[nxt];
}
}
}
}
if(res1 == res2 && res1 == 0){
cout << "Peace\n";
}
else if(res1 <= res2){
cout << lsh[p2] << ' ' << res2 * 2 << '\n';
}
else{
cout << lsh[p1] << ' ' << res1 * 2 << '\n';
}
}
return 0;
}