题解:CF1198B Welfare State

Bai_R_X

2025-01-15 11:29:02

题解

思路

对于操作 1:我们只需要记录每个点最后的一次修改,因为最后前的都会被最后一次所覆盖。

对于操作 2:我们也只需要最后且最大的一个 x ,因为前面会被覆盖,比最大小会因为最大让所有值都不低于 x ,再小不会有任何效果。

另外,由于操作 1 是单点修改,其优先级大于操作 2 。我们只需要记录每个点最后单点操作的时间,再与此时最大的操作 2 相比较即可。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[200005],i,q,op,p,x,op1[200005],op2[200005],t[200005];
signed main()
{
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
        op1[i]=-1;
    }
    cin>>q;
    for(i=1;i<=q;i++)
    {
        cin>>op;
        if(op==1)
        {
            cin>>p>>x;
            op1[p]=x;
            t[p]=i;
        }
        else
        {
            cin>>x;
            op2[i]=x;
        }
    }
    for(i=q;i>=0;i--)op2[i]=max(op2[i],op2[i+1]);
    for(i=1;i<=n;i++)
    {
        if(op1[i]>=0)a[i]=op1[i];
    }
    for(i=1;i<=n;i++)
    {
        if(a[i]<op2[t[i]])a[i]=op2[t[i]];
    }
    for(i=1;i<=n;i++)cout<<a[i]<<" ";
    return 0;
}