首页 > [hdu1828] Picture

[hdu1828] Picture

帅哥美女们大家好!

今天本蒟蒻补一篇题解!

线段树维护扫描线求矩形周长并。

扫描线的话,跟求面积类似,这道题可以只扫一次,也可以x,y两个方向分别扫一次。

题目传送门

 1 #include
 2 #include
 3 #include
 4 #define INF 0x3f3f3f3f
 5 #define MAXN 10010
 6 #define MAXM 20010
 7 #define MAXNODE 4*MAXN
 8 using namespace std;
 9 
10 int n,m,covered[MAXM<<2],segnum[MAXM<<2],len[MAXM<<2];
11 bool lb[MAXM<<2],rb[MAXM<<2];
12 
13 struct ln
14 {
15     int x1,x2,y,cover;
16     bool operator < (const ln& x) const
17     {
18         return y<x.y;
19     }
20 }line[MAXN];
21 
22 void add(int x1,int y1,int x2,int y2)
23 {
24     line[m].x1=x1;
25     line[m].x2=x2;
26     line[m].y=y1;
27     line[m++].cover=1;
28     line[m].x1=x1;
29     line[m].x2=x2;
30     line[m].y=y2;
31     line[m++].cover=-1;
32 }
33 
34 void pushdown(int o,int L,int R)
35 {
36     if(covered[o])
37     {
38         lb[o]=rb[o]=1;
39         len[o]=R-L;
40         segnum[o]=2;
41     }
42     else if(L+1>=R)lb[o]=rb[o]=len[o]=segnum[o]=0;
43     else
44     {
45         lb[o]=lb[o<<1];
46         rb[o]=rb[o<<1|1];
47         len[o]=len[o<<1]+len[o<<1|1];
48         segnum[o]=segnum[o<<1]+segnum[o<<1|1];
49         if(rb[o<<1]&&lb[o<<1|1]) segnum[o]-=2;
50     }
51 }
52 
53 void update(int o,int L,int R,int ql,int qr,int cover)
54 {
55     if(ql<=L&&qr>=R)
56     {
57         covered[o]+=cover;
58         pushdown(o,L,R);
59         return;
60     }
61     int mid=(L+R)>>1;
62     if(ql1,L,mid,ql,qr,cover);
63     if(qr>mid) update(o<<1|1,mid,R,ql,qr,cover);
64     pushdown(o,L,R);
65 }
66 
67 int main()
68 {
69     while(scanf("%d",&n)!=EOF)
70     {
71         m=0;
72         int LB=INF,RB=-INF;
73         while(n--)
74         {
75             int x1,y1,x2,y2;
76             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
77             LB=min(LB,x1);
78             RB=max(RB,x2);
79             add(x1,y1,x2,y2);
80         }
81         sort(line,line+m);
82         for(int i=0;i<(MAXM<<2);i++)
83             lb[i]=rb[i]=covered[i]=segnum[i]=len[i]=0;
84         int last=0,ans=0;
85         for(int i=0;i1;i++)
86         {
87             update(1,LB,RB,line[i].x1,line[i].x2,line[i].cover);
88             ans+=segnum[1]*(line[i+1].y-line[i].y);
89             ans+=abs(len[1]-last);
90             last=len[1];
91         }
92         ans+=len[1];
93         printf("%d
",ans);
94     }
95     return 0;
96 }
hdu1828 Picture

转载于:https://www.cnblogs.com/eternhope/p/9600771.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 为了不想让竞争对手看到我们使用的服务器的技术细节,我们可以将线上运行的ATS修改为我们自己设置的名字以及相应的版本号。在线修改如下选项 traffic_line -s proxy.config.http.response_server_str -v pcs/1.0.1 traffic_line -s proxy.config.htt...

  • 转载https://blog.csdn.net/qq_35883464/article/details/83151464 实现员工信息表文件存储格式如下:id,name,age,phone,job1,Alex,22,13651054608,IT2,Egon,23,13304320533,Tearcher3,nezha,25,1333...

  • oracle 10g: PL/SQL User's Guide and Reference ---> 10 Handling PL/SQL Errors ---> Summary of Predefined PL/SQL Exceptions 系统预定义异常(有名字的错误代码):TOO_MANY_ROWS : SELECT INTO...

  • [0. 需求] 最近在粗略学习《C++ Primer 4th》的容器内容,关联容器的章节末尾有个很不错的实例。通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解。由于是浅略探讨研究,高手可无视,各位读者发现有什么不妥的地方,请指教。 程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单...

  • 一  字节流 1.1字节输出流OutputStream OutputStream是一个抽象类,操作的数据都是字节。 输出流中定义都是写write方法,如下图: 1.1.1 FileOutputStream类 OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。FileOutputStre...