比赛 |
20250904开学热身赛 |
评测结果 |
AWWWW |
题目名称 |
内存分配 |
最终得分 |
20 |
用户昵称 |
123 |
运行时间 |
0.560 s |
代码语言 |
C++ |
内存使用 |
3.80 MiB |
提交时间 |
2025-09-04 21:15:38 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n,t,m,e,cnt=0,ret;
priority_queue<pair<int,pair<int,int> >,vector<pair<int,pair<int,int> > >,greater<pair<int,pair<int,int> > > > q;
queue<pair<int,int> > p;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > v,u;//左右端点
set<int> s;//长度
int check()
{
if (!q.empty()) return 0;
pair<int,pair<int,int> >g=q.top();q.pop();
if (q.top().first==g.first)
{
q.push(g);
return 1;
}
else
{
q.push(g);
return 0;
}
}
int main() {
freopen("memory.in","r",stdin);
freopen("memory.out","w",stdout);
cin>>n;
v.push({1,n});
s.insert(-n);
while (scanf("%d%d%d",&t,&m,&e) && (t || m || e))
{
while (!q.empty())
{
if (q.top().first>t) break;
while (q.size()>1 && check())
{
int x=q.top().second.first,y=q.top().second.second,flag=1;
while (!v.empty())
{
if (v.top().second==x-1)
{
s.erase(-(v.top().second-v.top().first+1));
u.push({v.top().first,y});
s.insert(-(y-v.top().first+1));
v.pop();
flag=0;
break;
}
if (v.top().first==y+1)
{
s.erase(-(v.top().second-v.top().first+1));
u.push({x,v.top().second});
s.insert(-(v.top().second-x+1));
v.pop();
flag=0;
break;
}
u.push(v.top());v.pop();
}
if (flag)
{
u.push({x,y});
s.insert(-(y-x+1));
}
while (!u.empty())
{
v.push(u.top());u.pop();
}
}
int x=q.top().second.first,y=q.top().second.second,flag=1;
while (!v.empty())
{
if (v.top().second==x-1)
{
s.erase(-(v.top().second-v.top().first+1));
u.push({v.top().first,y});
s.insert(-(y-v.top().first+1));
v.pop();
flag=0;
break;
}
if (v.top().first==y+1)
{
s.erase(-(v.top().second-v.top().first+1));
u.push({x,v.top().second});
s.insert(-(v.top().second-x+1));
v.pop();
flag=0;
break;
}
u.push(v.top());v.pop();
}
if (flag)
{
u.push({x,y});
s.insert(-(y-x+1));
}
while (!u.empty())
{
v.push(u.top());u.pop();
}
//修改
while (!p.empty() && p.front().first<=-(*(s.begin())))//判断
{
int k=p.front().first;
int l,r;
while (!v.empty())
{
int ll=v.top().first,rr=v.top().second;
if (rr-ll+1>=k)
{
l=ll,r=ll+k-1;
s.erase(-(rr-ll+1));
if (r!=rr)
{
u.push({r+1,rr});
s.insert(-(rr-r));
}
v.pop();
break;
}
u.push(v.top());v.pop();
}
while (!u.empty())
{
v.push(u.top());u.pop();
}
// cout<<k<<endl;
q.push({p.front().second+q.top().first,{l,r}});
p.pop();
}
q.pop();
}
// cout<<q.size()<<endl;
//cout<<q.size()<<endl;
if (m<=-(*(s.begin())))//有空间
{
int l,r;
while (!v.empty())
{
int ll=v.top().first,rr=v.top().second;
if (rr-ll+1>=m)
{
l=ll,r=ll+m-1;
s.erase(-(rr-ll+1));
if (r!=rr)
{
u.push({r+1,rr});
s.insert(-(rr-r));
}
v.pop();
break;
}
u.push(v.top());v.pop();
}
while (!u.empty())
{
v.push(u.top());u.pop();
}
q.push({t+e,{l,r}});
// cout<<t+e<<endl;
}
else
{
ret++;
p.push({m,e});
}
}
// cout<<q.size()<<endl;
while (!q.empty())
{
cnt=max(cnt,q.top().first);
while (q.size()>1 && check())
{
int x=q.top().second.first,y=q.top().second.second,flag=1;
while (!v.empty())
{
if (v.top().second==x-1)
{
s.erase(-(v.top().second-v.top().first+1));
u.push({v.top().first,y});
s.insert(-(y-v.top().first+1));
v.pop();
flag=0;
break;
}
if (v.top().first==y+1)
{
s.erase(-(v.top().second-v.top().first+1));
u.push({x,v.top().second});
s.insert(-(v.top().second-x+1));
v.pop();
flag=0;
break;
}
u.push(v.top());v.pop();
}
if (flag)
{
u.push({x,y});
s.insert(-(y-x+1));
}
while (!u.empty())
{
v.push(u.top());u.pop();
}
}
int x=q.top().second.first,y=q.top().second.second,flag=1;
while (!v.empty())
{
if (v.top().second==x-1)
{
s.erase(-(v.top().second-v.top().first+1));
u.push({v.top().first,y});
s.insert(-(y-v.top().first+1));
v.pop();
flag=0;
break;
}
if (v.top().first==y+1)
{
s.erase(-(v.top().second-v.top().first+1));
u.push({x,v.top().second});
s.insert(-(v.top().second-x+1));
v.pop();
flag=0;
break;
}
u.push(v.top());v.pop();
}
if (flag)
{
u.push({x,y});
s.insert(-(y-x+1));
}
while (!u.empty())
{
v.push(u.top());u.pop();
}
//修改
while (!p.empty() && p.front().first<=-(*(s.begin())))//判断
{
int k=p.front().first;
int l,r;
while (!v.empty())
{
int ll=v.top().first,rr=v.top().second;
if (rr-ll+1>=k)
{
l=ll,r=ll+k-1;
s.erase(-(rr-ll+1));
if (r!=rr)
{
u.push({r+1,rr});
s.insert(-(rr-r));
}
v.pop();
break;
}
u.push(v.top());v.pop();
}
while (!u.empty())
{
v.push(u.top());u.pop();
}
// cout<<k<<endl;
q.push({p.front().second+q.top().first,{l,r}});
p.pop();
}
q.pop();
}
cout<<cnt<<endl<<ret;
return 0;
}