Codeforces 1379 D. New Passenger Trams —— 尺取

This way

题意:

当前星球的一天有h小时,一小时有m分钟,现在有两种车要开,红色的每半小时开一次,每次要准备k分钟再开,并且你可以决定第一班车的开始时间,现在有一些蓝色的车的时刻表,它没有准备时间,并且它与红色的车的时间重合了就会被取消掉(端点不算),问你第一辆红色车的开始时间是多少才能取消掉最小的蓝色车的数量。

题解:

我真的被这场的ab搞晕了,c题做出来的时候已经要结束了,这道题根本没时间看。其实都是简单题啊,但是我不打cf的话适应不了这么紧张的时间。
这道题可以发现h是没有用的,我们可以把 m 2 \frac{m}{2} 2m看成一个循环,因为每半个小时红车就会发车。然后将所有的蓝车按时间% m 2 \frac{m}{2} 2m排序之后,尺取即可。

#include
using namespace std;
#define ll long long
const int N=1e5+5;
struct node{
    int id;
    ll m;
    bool operator< (const node& a)const {
        return m<a.m;
    }
}p[N*2];
deque<int>dq;
int main()
{
    int n;
    ll h,m,k,h1;
    scanf("%d%lld%lld%lld",&n,&h,&m,&k);
    m/=2;
    for(int i=1;i<=n;i++)
        scanf("%lld%lld",&h1,&p[i].m),p[i].id=i,p[i].m%=m;
    sort(p+1,p+1+n);
    for(int i=1;i<=n;i++)
        p[i+n]=p[i],p[i+n].m+=m;
    int l=2,del=n,sz=0,sta=0;
    int lef=0,rig=0;
    for(int i=1;i<=n;i++){
        if(dq.size()&&dq.front()==p[i].id)
            dq.pop_front(),sz--;
        l=max(l,i+1);
        while(p[l].m<=p[i].m+k-1)
            dq.push_back(p[l++].id),sz++;
        if(sz<del){
            if(dq.size())
                lef=i+1;
            del=sz,sta=(p[i].m+k)%m;
        }

    }
    printf("%d %d\n",del,sta);
    if(del){
        for(int i=lef;i<=lef+del-1;i++)
            printf("%d ",p[i].id);
    }
    printf("\n");
    return 0;
}

你可能感兴趣的:(尺取)