1 条题解
-
0
模拟题。
考虑从时间 出发往前走会碰到哪些被覆盖的点,发现当且仅当 且 。把所有的区间按 排序,则加点的次序是一段前缀。
将查询离线后按时间排序扫一遍,只需加点,求最小值和删点,可以优先队列实现。
#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
- 上传者