比赛 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;
}