1 条题解

  • 0
    @ 2026-6-9 10:33:33

    模拟题。

    考虑从时间 DD 出发往前走会碰到哪些被覆盖的点,发现当且仅当 SiXiDS_i-X_i \le DTiXi>DT_i-X_i>D。把所有的区间按 SiXiS_i-X_i 排序,则加点的次序是一段前缀。

    将查询离线后按时间排序扫一遍,只需加点,求最小值和删点,可以优先队列实现。

    #include<bits/stdc++.h>
    #define ll long long
    #define inf 1e18
    using namespace std;
    const int N=2e5+10;
    int n,m,ans[N];
    struct node
    {
        int d,num;
        bool operator <(const node &x)const
        {
            return d<x.d;
        }
    }q[N];
    struct rdwk
    {
        int pos,s,t;
        bool operator <(const rdwk &x)const
        {
            return pos>x.pos;
        }
    }a[N];
    priority_queue<rdwk>pq;
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>a[i].s>>a[i].t>>a[i].pos;
        sort(a+1,a+n+1,[](rdwk x,rdwk y){return x.s-x.pos<y.s-y.pos;});
        for(int i=1;i<=m;i++)
        {
            cin>>q[i].d;
            q[i].num=i;
        }
        sort(q+1,q+m+1);
        int p=1;
        for(int i=1;i<=m;i++)
        {
            while(p<=n&&a[p].s<=q[i].d+a[p].pos)
            {
                pq.push(a[p]);
                p++;
            }
            while(!pq.empty()&&pq.top().t<=q[i].d+pq.top().pos)pq.pop();
            if(pq.empty())ans[q[i].num]=-1;
            else ans[q[i].num]=pq.top().pos;
        }
        for(int i=1;i<=m;i++)cout<<ans[i]<<"\n";
        return 0;
    }
    
    • 1

    信息

    ID
    11668
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者