Codeforces Round 988 (Div. 3) D题题解
题目链接:D. Sharky Surfing
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k,sum=0,t;
struct node{
ll a,b;
}f[500500];
struct node2{
ll a,b;
}fa[500050];
int main(){
cin>>t;
while(t--){
priority_queue<int> pq;//利用优先队列去维护每一个障碍前的增长量保证从大到小最优解;
cin>>n>>m>>k;
for(int i=0;i<n;i++){
ll x,y;
cin>>fa[i].a>>x;//存储每个障碍的起点和长度
fa[i].b=x-fa[i].a+1;
}
for(int i=0;i<m;i++){
cin>>f[i].a>>f[i].b;//存储位置和增长量
}
ll ans=1,ro=0,sum=0,bi=0;
for(int i=0;ro<n;i++){
if(f[i].a>fa[ro].a||i>=m){//如果当前存储位置大于障碍,或没有增长量时
while(ans<=fa[ro].b&&pq.size()!=0){//循环将优先队列中大的元素加上
sum++;
ans+=pq.top();
pq.pop();
}
if(ans>fa[ro].b){
i--;//保证当前位置不变,变动到下一个障碍
ro++;
}
else{
bi=1;//不满足是结束
break;
}
}
else{
pq.push(f[i].b);//将在障碍前的增长量加入到优先队列中
}
}
if(bi==1){
cout<<"-1"<<endl;
}
else{
cout<<sum<<endl;
}
}
}

浙公网安备 33010602011771号