题目链接:https://www.luogu.com.cn/problem/P6013
思路
退役了,真的退役了......三个月没怎么刷题,div2的第一题就把我弄自闭了,写了半个小时,跑的还死慢。。不过我想只要是人都能看懂我这个代码,大体上就是硬核模拟。
#include <stdio.h>
#include <iostream>
#include <queue>
#define int long long int
#define N 1000001
using namespace std;
struct node//并没有什么卵用的结构体,事实上在后面的读入中只需要3个变量。
{
int id,val,to;//id:事件;val:得到或花掉的钱;to:仅事件3才有的参数[持续到第几天]
}a[N];
struct lst//这个结构体处理专门一系列的事件三
{
int duration,v;//duration代表封印持续到第几天,v代表封印的钱
bool operator < (const lst &a)const
{
return a.duration<duration;//把持续时间从小到达排序
}
}tmp;
int n,s,ans,f;
priority_queue<lst> q;//优先队列
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i,j;
cin>>n;
for(i=1;i<=n;i++)//枚举事件i
{
while(!q.empty())
{
if(q.top().duration==i)//判断某个事件3的持续时间是否已经到了i
{
s=s+q.top().v;//把钱拿回来
q.pop();//踢掉
}
else break;//如果不是就不管
}
cin>>a[i].id;//输入事件类型
if(a[i].id!=3)//如果不是3
{
cin>>a[i].val;
if(a[i].id==1)
{
s+=a[i].val;//直接赚钱即可
}
else//事件2
{
s-=a[i].val;//花钱
if(s<0)//如果没有足够的钱
{
s+=a[i].val;//再加回来
ans++;//不满意的次数+1
}
}
}
else//事件3
{
cin>>a[i].val>>a[i].to;
s-=a[i].val;//减钱
tmp.duration=a[i].to;
tmp.v=a[i].val;
q.push(tmp);//塞进队列
}
//cout<<s<<endl<<endl;
}
cout<<ans<<endl;
return 0;
}
/*
10
1 20
3 5 9
2 20
3 5 6
1 10
2 20
1 15
3 5 9
2 20
2 15
2
*/


446

被折叠的 条评论
为什么被折叠?



