题目描述:(简化)
给出飞行员高度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;
}