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

原文地址:https://www.cnblogs.com/guapisolo/p/9697018.html

时间: 2024-10-14 05:58:59

[USACO18JAN] Lifeguards S (线段树:扫描线面积)的相关文章

hdu 1542 Atlantis(线段树&amp;扫描线&amp;面积并)

Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6386    Accepted Submission(s): 2814 Problem Description There are several ancient Greek texts that contain descriptions of the fabled i

HDU 1542 Atlantis(线段树扫描线&#183;面积并)

题意  给你一些矩形的左下和右上的坐标  求这些矩形的面积并 最基础的扫描线  理解了就是个水题了  先看一些图吧                                恩  看完了有什么感觉没有  那些红色的线就可以当作传说中的扫描线  就像从左到右扫描嘛  可以发现  矩形有竖直边的地方就有这些线  这些线把把拼在一起的矩形切成了一个个的小矩形  我们把这些小矩形的面积加起来不就是要求的面积吗 那么现在这些小矩形的面积怎么求呢  长乘宽嘛  长是什么  两条红线之间的距离  恩  我

HDU 3265 Posters (线段树+扫描线)(面积并)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 给你n个中间被挖空了一个矩形的中空矩形,让你求他们的面积并. 其实一个中空矩形可以分成4个小的矩形,然后就是面积并,特别注意的是x1 == x3 || x2 == x4的时候,要特判一下,否则会RE. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algori

hdu1255 覆盖的面积 线段树-扫描线

矩形面积并 线段树-扫描线裸题 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 using namespace std; 6 const int maxm=2e3+5; 7 const double eps=1e-5; 8 9 struct seg{ 10 double x,y1,y2; 11 int c; 12 bool operator

poj 3277 City Horizon (线段树 扫描线 矩形面积并)

题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不会出错, 所有的区间都能列出来,只是在查找的时候费点事. 给的矩形相当于在同一水平线上的,也就是y1坐标相当于为0,其他的就和 poj 1151 Atlantis 差不多了. 我写的思路是按照矩形面积并的思路写的: 但是还有另一种方法也是挺简单的,就是把给的矩形按照高从小到大排序,然后依次插入线段树

HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

Problem A : Counting Squares From:HDU, 1264 Problem Description Your input is a series of rectangles, one per line. Each rectangle is specified as two points(X,Y) that specify the opposite corners of a rectangle. All coordinates will be integers in t

HDU 1255 覆盖的面积(线段树扫描线)

Problem Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1<=N<=1000),代表矩形的数量,然后是N行数据,每一行包含四个浮点数,代表平面上的一个矩形的左上角坐标和右下角坐标,矩形的上下边和X轴平行,左右边和Y轴平行.坐标的范围从0到100000. 注意:本题的输入数据较多,推荐使用scanf读入数据. Out

hdu 1255 覆盖的面积(线段树&amp;扫描线&amp;重复面积)

覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3375    Accepted Submission(s): 1645 Problem Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input 输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数

poj 1151 求矩形面积并 (线段树扫描线)

题意: 给出n个矩形的左下角和右上角坐标,求这n个矩形所构成的面积 思路: 线段树扫描线 这是第一次做到线段树扫描线,刚开始也不懂 如果不懂,可以看: http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html 和 http://www.faceye.net/search/69289.html 我是看第一个链接弄懂的 然后学习了第二位的方法 代码上也有比较详细的注释,想可以帮到大家 code: #include<cstd