[USACO18JAN] Lifeguards S (线段树:扫描线面积)

Posted guapisolo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO18JAN] Lifeguards S (线段树:扫描线面积)相关的知识,希望对你有一定的参考价值。

扫描线裸题没什么好说的

注意空间不要开小了!!!

 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
",ret);
61     return 0;
62 }

 

以上是关于[USACO18JAN] Lifeguards S (线段树:扫描线面积)的主要内容,如果未能解决你的问题,请参考以下文章

[Luogu P2771][USACO16JAN]Build Gates S

luogu4185 [USACO18JAN]MooTube [并查集]

[luogu p3612] [USACO17JAN]Secret Cow Code S

[USACO18JAN]Stamp Painting

[USACO 18Jan Gold] Moo Tube

P2937 [USACO09JAN]Laserphones S