题意:就是给若干个技能,每个技能有不同的伤害,技能只有两种,一种雷,一种火,可以自定义技能释放顺序,使用一次雷元素技能可以使下个技能伤害翻倍。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;
}