Codeforse(E. Two Types of Spells)set模拟

在这里插入图片描述
在这里插入图片描述

题意:就是给若干个技能,每个技能有不同的伤害,技能只有两种,一种雷,一种火,可以自定义技能释放顺序,使用一次雷元素技能可以使下个技能伤害翻倍。n次操作,每次操作会学习或忘记一种技能(一开始啥技能也不会),计算每次操作后能释放的最大伤害值。
用set模拟就行了,过程一定要清晰明了,注意细节
代码:

#include <bits/stdc++.h>
#define ll long long
#define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

struct node
{
    
    ll op,val; };
struct cmp{
    
    
    bool operator()(const node &x,const node &y)
    {
    
    
        if(x.val>y.val)
        {
    
    return 1;}
        return 0;
    }
};
set<node,cmp> e2;
set<node,cmp> thunder;
set<node,cmp> fire;
set<node,cmp> L;
set<node,cmp> F;
set<node>::iterator it;
ll ans=0,st=0;

void update()
{
    
    
    if(st==0)
    {
    
    
        while(1)
        {
    
    
            if(thunder.size()==1&&fire.size()==0){
    
    break;}
            if(e2.size()==0){
    
    break;}
            it=e2.end();it--;
            node w=*it;
            if(fire.size()==0&&thunder.size()>1)
            {
    
    
                it=thunder.begin();
                node u=*it;
                if(u.val>w.val)
                {
    
    
                    e2.erase(w);
                    if(w.op==1){
    
    thunder.insert(w);}
                    else{
    
    fire.insert(w);}
                    thunder.erase(u);
                    e2.insert(u);
                    ans-=w.val;
                    ans+=u.val;
                    continue;
                }
                else{
    
    break;}
            }
            if(thunder.size()==1&&fire.size()>0)
            {
    
    
                it=fire.begin();
                node u=*it;
                if(u.val>w.val)
                {
    
    
                    e2.erase(w);
                    if(w.op==1){
    
    thunder.insert(w);}
                    else{
    
    fire.insert(w);}
                    fire.erase(u);
                    e2.insert(u);
                    ans-=w.val;
                    ans+=u.val;
                    continue;
                }
                else{
    
    break;}
            }
            if(thunder.size()>1&&fire.size()>0)
            {
    
    
                it=thunder.begin();
                node u=*it;
                it=fire.begin();
                node t=*it;
                node s;
                if(t.val>=u.val){
    
    s=t;}
                else{
    
    s=u;}
                if(s.val>w.val)
                {
    
    
                    e2.erase(w);
                    if(w.op==1){
    
    thunder.insert(w);}
                    else{
    
    fire.insert(w);}
                    if(s.op==1){
    
    thunder.erase(s);}
                    else{
    
    fire.erase(s);}
                    e2.insert(s);
                    ans-=w.val;
                    ans+=s.val;
                    continue;
                }
                else{
    
    break;}
            }
        }
    }
    while(st>0)
    {
    
    
        //if(st<0){break;}
        if(thunder.size()==1&&fire.size()==0){
    
    break;}
        if(fire.size()==0&&thunder.size()>1)
        {
    
    
            it=thunder.begin();
            node u=*it;
            thunder.erase(u);
            e2.insert(u);
            ans+=u.val;
            st--;
            continue;
        }
        if(thunder.size()==1&&fire.size()>0)
        {
    
    
            it=fire.begin();
            node u=*it;
            fire.erase(u);
            e2.insert(u);
            ans+=u.val;
            st--;
            continue;
        }
        if(thunder.size()>1&&fire.size()>0)
        {
    
    
            it=thunder.begin();
            node u=*it;
            it=fire.begin();
            node t=*it;
            if(t.val>=u.val)
            {
    
    
                fire.erase(t);
                e2.insert(t);
                ans+=t.val;
                st--;
            }
            else
            {
    
    
                thunder.erase(u);
                e2.insert(u);
                ans+=u.val;
                st--;
            }
        }
    }
    while(st<0)
    {
    
    
        it=e2.end();it--;
        node u=*it;
        if(u.op==1)
        {
    
    
            e2.erase(u);
            thunder.insert(u);
            ans-=u.val;
            st++;
        }
        else
        {
    
    
            e2.erase(u);
            fire.insert(u);
            ans-=u.val;
            st++;
        }
    }
}
void add(ll op,ll x)
{
    
    
    if(op==1)
    {
    
    
        thunder.insert({
    
    op,x});
        L.insert({
    
    op,x});
        ans+=x;
        st++;
    }
    if(op==0)
    {
    
    
        fire.insert({
    
    op,x});
        F.insert({
    
    op,x});
        ans+=x;
    }
    update();
}
void del(ll op,ll x)
{
    
    
    it=e2.find({
    
    op,x});//翻倍区
    if(it!=e2.end())
    {
    
    
        e2.erase({
    
    op,x});
        ans-=2*x;
        st++;
        if(op==1){
    
    st--;}
    }
    it=fire.find({
    
    op,x});//火元素区
    if(it!=fire.end())
    {
    
    
        fire.erase({
    
    op,x});
        ans-=x;
    }
    it=thunder.find({
    
    op,x});//雷元素区
    if(it!=thunder.end())
    {
    
    
        thunder.erase({
    
    op,x});
        ans-=x;
        st--;
    }
    it=F.find({
    
    op,x});//火元素库
    if(it!=F.end())
    {
    
    
        F.erase({
    
    op,x});
    }
    it=L.find({
    
    op,x});//雷元素库
    if(it!=L.end())
    {
    
    
        L.erase({
    
    op,x});
        if(L.size()!=0)
        {
    
    
            it=L.end();it--;
            node u=*it;
            it=e2.find(u);
            if(it!=e2.end())
            {
    
    
                e2.erase(u);
                thunder.insert(u);
                ans-=u.val;
                st++;
            }
        }
    }
    update();
}
int main()
{
    
    
    IOS
    ll n,op,x;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    
    
        cin>>op>>x;
        if(x>0)
        {
    
    add(op,x);}
        else
        {
    
    del(op,-x);}
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43781431/article/details/108037653