D题,是求最远能飞到哪里,肯定是从某一个气流的起点开始飞飞的最远,我们就可以枚举每一个气流,看最远能飞到哪里,然后取最大值,怎么判断最远飞到哪里就可以通过先求出前缀和,在看某一段+h可以走过多少间隙就可以了,当时写前缀和的时候把自己写迷糊了,这是别人的代码:
#include<bits/stdc++.h> using namespace std; const int MAX = 2e5 + 5; int n,h; int b[MAX],c[MAX]; struct Node { int l,r; } node[MAX]; int main() { cin>>n>>h; for(int i = 1; i<=n; i++) scanf("%d%d",&node[i].l,&node[i].r); c[1] = 0;b[1] = node[1].r-node[1].l; for(int i = 2; i<=n; i++) { b[i] = node[i].r - node[i].l; c[i] = node[i].l - node[i-1].r; b[i] += b[i-1]; c[i] += c[i-1]; } c[n+1] = INT_MAX; int maxx = -1,ans; for(int i = 1; i<=n; i++) { int pos = lower_bound(c+1,c+n+1,c[i]+h) - c; ans = b[pos-1] - b[i-1]; maxx = max(maxx,ans); } printf("%d\n",maxx+h); return 0 ; }