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;
	}
	}
}

 

posted @ 2024-11-19 14:19  薇尔莉特·伊芙加登  阅读(22)  评论(0)    收藏  举报