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 }
View Code

 

posted @ 2018-09-18 19:52  汪汪鱼  阅读(167)  评论(0编辑  收藏  举报