CF1248E Queue in the Train

@Pelom  October 11, 2021

题意

$n$个人会在$t_i$时刻产生接水的想法,若$1 \dots i-1$没有人在排队,那么他会去排队;每个人接水的时间为$p$,求每个人接水完成的时间

数据范围:$1 \le n \le 100000,1 \le p \le 10^9,0 \le t_i \le 10^9$

题解

模拟题
用$3$个优先队列,分别储存

  • 原序列
  • 产生接水想法的人
  • 正在排队的人

按题意模拟即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
#define int long long
const int N=100000+10;
int n,p;
int t[N];
int T;
int ans[N];
struct node{
    int ti,id;
    bool f;
    inline node(int ti=0,int id=0,bool f=0):ti(ti),id(id),f(f){}
    inline bool operator < (const node& x) const{
        return ti==x.ti?(f==x.f?id<x.id:f<x.f):ti<x.ti;
    }
};
set<node> a;
set<int> q,r;
signed main(){
    scanf("%lld%lld",&n,&p);
    for(int i=1;i<=n;i++){
        scanf("%lld",&t[i]);
        a.insert(node{t[i],i,0});
    }
    for(;!a.empty();){
        int ti=a.begin()->ti;
        int id=a.begin()->id;
        bool f=a.begin()->f;
        a.erase(a.begin());
        if(f==0){
            if(q.empty() || *q.begin()>id){
                q.insert(id);
                T=max(T,t[id])+p;
                a.insert(node{T,id,1});
            }
            else r.insert(id);
        }
        else{
            ans[id]=ti;
            q.erase(id);
            for(;!r.empty() && (q.empty() || *q.begin()>*r.begin());){
                int id=*r.begin();
                r.erase(r.begin());
                q.insert(id);
                T=max(T,t[id])+p;
                a.insert(node{T,id,1});
            }
        }
    }
    for(int i=1;i<=n;i++)
        printf("%lld ",ans[i]);
    return 0;
}

添加新评论