1. 程式人生 > >[USACO18JAN] Lifeguards S (線段樹:掃描線面積)

[USACO18JAN] Lifeguards S (線段樹:掃描線面積)

data include esp space mes amp define sum swap

掃描線裸題沒什麽好說的

註意空間不要開小了!!!

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define N 100100
 5 #define ll long long
 6 using namespace std;
 7 
 8 int n,ctx;
 9 int cnt[N<<3];
10 ll a[N<<1],sum[N<<3];
11 struct node{
12     ll l,r;
13     int la,ra;
14 }sc[N<<1]; 15 void pushup(int l,int r,int rt) 16 { 17 if(cnt[rt]>0) sum[rt]=a[r+1]-a[l]; 18 else if(l==r) sum[rt]=0; 19 else sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 20 } 21 void update(int L,int R,int l,int r,int rt,int w) 22 { 23 if(L<=l&&r<=R) 24 {
25 cnt[rt]+=w; 26 pushup(l,r,rt); 27 return; 28 } 29 int mid=(l+r)>>1; 30 if(L<=mid) update(L,R,l,mid,rt<<1,w); 31 if(R>mid) update(L,R,mid+1,r,rt<<1|1,w); 32 pushup(l,r,rt); 33 } 34 35 int main() 36 { 37 //freopen("testdata.in","r",stdin);
38 scanf("%d",&n); 39 for(int i=1;i<=n;i++) 40 { 41 scanf("%lld%lld",&sc[i].l,&sc[i].r); 42 if(sc[i].l>sc[i].r) swap(sc[i].l,sc[i].r); 43 a[++ctx]=sc[i].l,a[++ctx]=sc[i].r; 44 } 45 sort(a+1,a+ctx+1); 46 int sz=unique(a+1,a+ctx+1)-(a+1); 47 for(int i=1;i<=n;i++) 48 { 49 sc[i].la=lower_bound(a+1,a+sz+1,sc[i].l)-a; 50 sc[i].ra=lower_bound(a+1,a+sz+1,sc[i].r)-a; 51 update(sc[i].la,sc[i].ra-1,1,sz,1,1); 52 } 53 ll ret=0; 54 for(int i=1;i<=n;i++) 55 { 56 update(sc[i].la,sc[i].ra-1,1,sz,1,-1); 57 ret=max(ret,sum[1]); 58 update(sc[i].la,sc[i].ra-1,1,sz,1,1); 59 } 60 printf("%lld\n",ret); 61 return 0; 62 }

[USACO18JAN] Lifeguards S (線段樹:掃描線面積)