codeforces1029C

            传送门::https://codeforces.com/contest/1029/problem/C

  题意::给你n个区间,给你一次操作删除一个区间,求剩余区间交集的最大范围;

 分析 :直接线段树 复杂度 O(n*4*log n),维护左端点的最大值 右端点的最小值

 1 #include<bits/stdc++.h>
 2 #define ull unsigned long long
 3 #define ll long long
 4 const int inf=1e9+7;
 5 const int maxn=3e5+5;
 6 using namespace std;
 7 
 8 int Max[maxn*4],Min[maxn*4];
 9 int a[maxn],b[maxn];
10 
11 void build(int l,int r,int rt)
12 {
13     if(l==r){
14         Max[rt]=a[l];
15         Min[rt]=b[l];
16         return ;
17     }
18     int mid=(l+r)>>1;
19     build(l,mid,2*rt);
20     build(mid+1,r,2*rt+1);
21     Max[rt]=max(Max[2*rt],Max[2*rt+1]);
22     Min[rt]=min(Min[2*rt],Min[2*rt+1]);
23 }
24 void update1(int target,int l,int r,int rt,int add)
25 {
26     if(l==r)
27     {
28         Max[rt]=add;
29         return ;
30     }
31     int mid=(l+r)>>1;
32     if(target<=mid){
33         update1(target,l,mid,2*rt,add);
34     }
35     if(target>mid){
36         update1(target,mid+1,r,2*rt+1,add);
37     }
38     Max[rt]=max(Max[2*rt],Max[2*rt+1]);
39     Min[rt]=min(Min[2*rt],Min[2*rt+1]);
40 }
41 void update2(int target,int l,int r,int rt,int add)
42 {
43     if(l==r){
44         Min[rt]=add;
45         return ;
46     }
47     int mid=(l+r)>>1;
48     if(target<=mid){
49         update2(target,l,mid,2*rt,add);
50     }
51     if(target>mid){
52         update2(target,mid+1,r,2*rt+1,add);
53     }
54     Max[rt]=max(Max[2*rt],Max[2*rt+1]);
55     Min[rt]=min(Min[2*rt],Min[2*rt+1]);
56 }
57 
58 int main()
59 {
60     int n;
61     scanf("%d",&n);
62     for(int i=1;i<=n;i++){
63         scanf("%d%d",&a[i],&b[i]);
64     }
65     build(1,n,1);
66     int maxnn=0;
67     for(int i=1;i<=n;i++)
68     {
69         update1(i,1,n,1,0);
70         update2(i,1,n,1,1e9+77);
71         maxnn=max(maxnn,Min[1]-Max[1]);
72         update1(i,1,n,1,a[i]);
73         update2(i,1,n,1,b[i]);
74     }
75     printf("%d\n",maxnn);
76     return 0;
77 }
View Code

 

posted @ 2019-10-27 17:05  sj-_-js  阅读(124)  评论(0编辑  收藏  举报