洛谷 P2061 [USACO07OPEN]城市的地平线City Horizon

简化版的矩形面积并,不用线段树,不用离散化,代码意外的简单

扫描线,这里的基本思路就是把要求的图形竖着切几刀分成许多矩形,求面积并。(切法就是每出现一条与y轴平行的线段都切一刀)

对于每一个切出来的矩形在处理其右边的线段时计算面积的贡献,

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<set>
 4 using namespace std;
 5 typedef long long LL;
 6 struct Q
 7 {
 8     int a,b,h;
 9 }q[40100];
10 struct QQ
11 {
12     int pos,fl,h;
13     bool operator<(const QQ &b)
14     {
15         return pos<b.pos;
16     }
17 }qq[80100];
18 int n,len;LL ans;
19 multiset<int> s;
20 int main()
21 {
22     int i;LL t;
23     scanf("%d",&n);
24     for(i=1;i<=n;i++)    scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].h);
25     for(i=1;i<=n;i++)    qq[++len]=(QQ){q[i].a,1,q[i].h},qq[++len]=(QQ){q[i].b,-1,q[i].h};
26     sort(qq+1,qq+len+1);
27     for(i=1;i<=len;i++)
28     {
29         if(!s.empty())
30         {
31             t=*s.rbegin();ans+=t*(qq[i].pos-qq[i-1].pos);
32         }
33         if(qq[i].fl==1)    s.insert(qq[i].h);
34         else    s.erase(s.find(qq[i].h));
35     }
36     printf("%lld",ans);
37     return 0;
38 }
posted @ 2018-04-09 19:50  hehe_54321  阅读(221)  评论(0编辑  收藏  举报
AmazingCounters.com