codeforces 1041 d 二分
题意转化:有一些区间,要求选一些连续的区间。两两区间间隔的和要求小于H。要求区间的长度和尽可能长。
二分区间长度的和,check一下就行
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 struct node { 6 int l,r; 7 }; 8 9 node a[200005]; 10 11 int n,h; 12 13 bool check(int mid) { 14 15 int ans = a[1].r - a[1].l; 16 if(ans >= mid) { 17 return true; 18 } 19 int cha = 0; 20 int ll = 1; 21 for(int i = 2; i <= n; i++) { 22 //cout<<ans<<endl; 23 ans += a[i].r - a[i].l; 24 cha += a[i].l - a[i - 1].r; 25 26 while(cha >= h) { 27 cha -= a[ll + 1].l - a[ll].r; 28 ans -= a[ll].r - a[ll].l; 29 ll++; 30 } 31 //cout<<mid<<' '<<cha<<endl; 32 if(ans >= mid) { 33 return true; 34 } 35 } 36 37 38 return false; 39 } 40 int main() { 41 42 43 44 scanf("%d %d",&n,&h); 45 46 for(int i = 1; i <= n; i++) { 47 scanf("%d %d",&a[i].l,&a[i].r); 48 } 49 50 int l = 0; 51 int r = 1000000005; 52 int mid; 53 54 while(r - l > 1) { 55 mid = l + r >> 1; 56 if(check(mid)) { 57 l = mid; 58 } 59 else { 60 r = mid; 61 } 62 } 63 64 printf("%d",l + h); 65 66 67 return 0; 68 }