P14962 [LBA-OI R2 A] 一次买够题解

P14962 [LBA-OI R2 A] 一次买够

题目背景

小清新签到题~

题目描述

小 Y 非常有钱,所以她可以买下所有她想要的东西。

今天,她来到商店购物。商店有 nnn 件商品,第 iii 件商品的价格为 viv_ivi,性价比为 wiw_iwi。一开始,小 Y 会买下性价比最大的所有商品(如果有多个就全部买下)。接下来,有 mmm 个事件依次发生,第 i  (1≤i≤m)i\;(1 \leq i \leq m)i(1im) 个事件可能为以下两种类型之一:

  1. 新增一件价格为 xix_ixi,性价比为 yiy_iyi 的商品,其编号为 n+in+in+i
  2. 将编号为 xix_ixi 的商品的性价比更改为 yiy_iyi

请注意,一旦小 Y 买下了某件商品,之后即使这件商品的性价比降低,小 Y 也不会出售这件商品。

每次事件后,计算小 Y 已买下商品中的最低性价比 LLL,小 Y 会在此时买下所有性价比 ≥L\ge LL 的未被购买的商品。

作为小 Y 的生活助理,你需要统计每次事件后小 Y 的总花销。

输入格式

第一行,两个整数 n,mn, mn,m,分别表示商品数与事件数。

接下来 nnn 行,第 iii 行包含两个整数 vi,wiv_i, w_ivi,wi

接下来 mmm 行,第 iii 行包含三个整数 oi,xi,yio_i, x_i, y_ioi,xi,yi,其中 oi=1o_i = 1oi=1 表明事件 iii 是新增商品事件,oi=2o_i = 2oi=2 表明事件 iii 是修改性价比事件。

输出格式

输出共 mmm 行。第 iii 行包含一个整数,表示事件 iii 后小 Y 的总花销。

输入输出样例 #1

输入 #1

6 4
1 1
1 2
1 3
1 4
1 5
1 5
2 5 4
1 10 3
2 8 4
2 5 2

输出 #1

3
3
13
15

输入输出样例 #2

输入 #2

5 5
11 4
13 6
14 3
20 8
0 5
2 4 5
2 5 0
2 4 10
1 12 2
2 1 0

输出 #2

33
58
58
70
70

说明/提示

样例解释 1

初始,编号为 5,65, 65,6 的商品性价比最高,因此所有小 Y 购买的商品为 {5,6}\{5, 6\}{5,6}

事件 111 中,商品 555 的性价比被修改为 444。此时有 w4≥w5w_4 \geq w_5w4w5,因此小 Y 购买商品 444,而其余商品仍未被购买。此时所有小 Y 购买的商品为 {4,5,6}\{4, 5, 6\}{4,5,6}

事件 222 中,新增了一件商品,其编号为 6+2=86+2=86+2=8,但其性价比只有 333,因此小 Y 没有购买它。

事件 333 中,商品 888 的性价比被修改为 444,此时小 Y 购买商品 888,现在所有她购买的商品为 {4,5,6,8}\{4, 5, 6, 8\}{4,5,6,8}

事件 444 中,商品 555 的性价比被修改为 222,最终所有小 Y 购买的商品为 {2,3,4,5,6,8}\{2, 3, 4, 5, 6, 8\}{2,3,4,5,6,8}

数据范围
子任务编号特殊性质分值
111n,m≤3000n, m \leq 3000n,m3000606060
222wi,yi≤10w_i, y_i \leq 10wi,yi10151515
333252525

对于所有数据:保证 1≤n≤2×1051 \leq n \leq 2\times 10^51n2×1051≤m≤2×1051 \leq m \leq 2\times 10^51m2×1050≤vi,wi,yi≤1090 \leq v_i, w_i, y_i \leq 10^90vi,wi,yi109oi∈{1,2}o_i \in \{1, 2\}oi{1,2}。若 oi=1o_i = 1oi=1,则 0≤xi≤1090 \leq x_i \leq 10^90xi109,否则保证编号为 xix_ixi 的商品已经存在。

思路

用两个堆维护即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,m,op=0,l=0,o,x,y;
struct one{
    long long u,w,i,x,zw;
}a[500005];
struct two{
    long long w,i,zw;
};
bool operator<(one a1,one b1){
    return a1.w<b1.w;
}
bool operator<(two a1,two b1){
    return a1.w>b1.w;
}
priority_queue<one> q;
priority_queue<two> w;
map<long long,long long> mp;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&a[i].u,&a[i].w);
        a[i].i=i;
        l=max(l,a[i].w);
        q.push(a[i]);
        mp[i]=0;
    }
    while(q.size()>=1&&q.top().w>=l){
        a[q.top().i].x=1;
        op+=q.top().u;
        w.push({q.top().w,q.top().i,q.top().zw});
        q.pop();
    }
    //cout<<op<<endl;
    for(int i=1;i<=m;i++){
        scanf("%lld%lld%lld",&o,&x,&y);
        if(o==1){
           //n++;
            a[n+i]=(one){x,y,n+i,0,i};
            q.push(a[n+i]);
            mp[n+i]=i;
        }
        else{
            a[x].w=y;
            a[x].zw=i;
            mp[x]=i;
            if(a[x].x==1){
                //cout<<"d"<<endl;
                l=min(l,a[x].w);
                w.push({a[x].w,a[x].i,a[x].zw});
            }
            else{
                q.push(a[x]);
            }
        }
        while(w.size()>=1&&w.top().zw!=mp[w.top().i]){
            w.pop();
        }
        while(q.size()>=1&&q.top().w>=w.top().w){
            if(q.top().zw==mp[q.top().i]){
                a[q.top().i].x=1;
                op+=q.top().u;  
                w.push({q.top().w,q.top().i,q.top().zw});
            }
            q.pop();
        }        
        cout<<op<<'\n';
    }
	return 0;
}
posted @ 2026-01-27 21:16  bz02_2023f2  阅读(3)  评论(0)    收藏  举报  来源