传送门::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 ",maxnn); 76 return 0; 77 }