Codeforces Round #509 (Div. 2) D. Glider(前缀和)

题目描述:(简化)
给出飞行员高度h,和n个上升气流区间,飞行员可从任意位置x跳下,求飞行员最大的滑行距离
题目链接:http://codeforces.com/contest/1041/problem/D
思路:为区间的长度存一个前缀和数组a[],为没有气流的空白区间存前缀和数组b[],因为给出的区间已经排过序,所有可有前一个区间的y和本区间的x做差求出空白区间,选从第i各区间开始时,用lower_bound求出飞行员落地的区间,进而用a[]数组求出落地距离。
c++代码:


    #include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int maxn=1e6;
/*
struct node {
	int x1,x2;
};
*/
int a[maxn];
vector <int> fl,b,bq;

int main() {
	int n,h;
	cin >> n >> h;
	for(int i=0;i<n;i++) {
         int x,y,oy;
		 cin >> x >>y;
		 if(i){
		 	//cout << oy << endl;
		 	//cout << x-oy <<endl;
		    b.push_back(x-oy);
		 }	
		 oy=y;		
		 a[i]=y-x;
	}
	if(n==1) {
		cout << a[0]+h << endl;
		return 0;
	}
	bq.push_back(b[0]);
	for(int i=1;i<b.size();i++) {
		bq.push_back(bq[bq.size()-1]+b[i]);
	}  //储存空白部分的前缀和 
 	fl.push_back(a[0]);
	for(int i=1;i<n;i++) {
		fl.push_back(fl[fl.size()-1]+a[i]);
	}  //储存气流部分的区间和 
	int ans=0;
	for(int i=0;i<n;i++) {
		int het=(i==0?0:bq[i-1])+h;
		int x=lower_bound(bq.begin()+i,bq.end(),het)-bq.begin();
		if(i>0)
		ans=max(ans,fl[x]-fl[i-1]+h);
		else ans=max(ans,fl[x]+h);
	}
	cout << ans << endl;
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/82914576