一个很奇怪的模拟写法,不知道哪里细节没有处理好,有没有大佬看一下的
#include<cstdio>
#include<iostream>
using namespace std;
const int MAXN=1e5+10;
struct node
{
int t,w;
}ticket[MAXN];
int head,tail;
int nxt[MAXN],lst[MAXN];
int n;
int ans;
inline void Add(int x)
{
if(tail==0)
{
head=x;
tail=x;
lst[x]=0;
nxt[x]=0;
return ;
}
lst[x]=tail;
nxt[tail]=x;
nxt[x]=0;
tail=x;
return ;
}
inline void Delete(int x)
{
if(x==head)
{
head=nxt[x];
lst[nxt[x]]=0;
return ;
}
if(x==tail)
{
tail=lst[x];
nxt[lst[x]]=0;
return ;
}
nxt[lst[x]]=nxt[x];
lst[nxt[x]]=lst[x];
return ;
}
inline bool check(int w)
{
int now=head;
while(now)
{
if(ticket[now].w>=w)
{
Delete(now);
return true;
}
now=nxt[now];
}
return false;
}
inline void check_t(int t)
{
int now=head;
while(now)
{
if(t-ticket[now].t>45) Delete(now);
now=nxt[now];
}
return ;
}
inline void print()
{
int now=head;
while(now)
{
cout<<now<<" ";
now=nxt[now];
}
cout<<"\n";
return ;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
// cout<<i<<" "<<ans<<"\n";
// print();
int opt,w,t;
cin>>opt>>w>>t;
check_t(t);
if(opt==0)
{
ans+=w;
ticket[i].t=t;
ticket[i].w=w;
Add(i);
}
else
{
if(check(w)) continue;
ans+=w;
}
}
cout<<ans;
return 0;
}