这困扰我N久的题目,终于过了。

求N个矩形的周长并,一开始觉得太遥不可及了,感觉好复杂 ,总想先搞懂计算的方法,再看大牛的方法,可是N久之后,对那个方法还是一知半解;

今天结合了代码还有下面俩副图之后,突然觉得豁然开朗啦,自己敲了一遍代码……

重点:我觉得,最重要的就是理解下面三个式子了,理解了之后,就知道该怎么建立线段树了;

ans+=num[1]*(ss[i+1].x-ss[i].x);(横边)
   ans+=abs(len[1]-last);(竖边)
   last=len[1];

对所有的竖边按照x值从小到排序,之后按顺序插入线段树;

ans累加的是最终结果,num[1]是整个区间内连续的线段数(将竖边投影到y轴的区间),len[1]表示整个区间内被覆盖的长度,而last保存的是上一次的len[1];

也就是说,从左往右在每一次插入一条边后,周长并的累加值==新增的横边+新增的竖边。

我们可以发现,插入一条边之后,新增的横边的树木等于区间内连续线段的数目*新增横边的长度,新增的竖边等于插入前后覆盖长度的差值。

结合下面的图片我们会发现:插入一条出边之后,其实等同于删除该矩形对应的入边。对应下图,此时也就出现了不连续的线段了。横边也相应增加了。

注意:不需要重复建树,因为插入所有边后,相对的也将树中可能产生影响的域给清空了。

结合代码吧:

#include<iostream>
#include<algorithm>
#define maxn 20010
using namespace std;
struct node
{int x,y1,y2,s;node(int a=0,int b=0,int c=0,int d=0):x(a) , y1(b) , y2(c) , s(d) {}friend bool operator <(const node a,const node b){return a.x<b.x;}
};
node ss[maxn>>1];//保存矩形的边,其中s表示该边为入边还是出边
bool cmp(node a,node b)
{return a.x<b.x;
}
bool lb[maxn<<2],rb[maxn<<2];
int cnt[maxn<<2],len[maxn<<2],num[maxn<<2];
//len[]表示该区间被覆盖的总长度
//num[]表示该区间内连续的线段数目
//cnt[]表示该区间被覆盖的次数
void PushUp(int k,int s,int t)
{if(cnt[k]){lb[k]=rb[k]=1;num[k]=2;len[k]=t-s+1;}else if(s==t)lb[k]=rb[k]=num[k]=len[k]=0;else {num[k]=num[k<<1]+num[k<<1 |1];len[k]=len[k<<1]+len[k<<1 |1];lb[k]=lb[k<<1];rb[k]=rb[k<<1|1];if(rb[k<<1] && lb[k<<1 |1])//左右子区间的有一个线段相连num[k]-=2;}
}
void update(int l,int r,int c,int s,int t,int k)
{if(l<=s && t<=r){cnt[k]+=c;//插边或删边PushUp(k,s,t);return ;}int kl=k<<1,kr=kl+1,mid=(s+t)>>1;if(l<=mid)update(l,r,c,s,mid,kl);if(r>mid)update(l,r,c,mid+1,t,kr);PushUp(k,s,t);
}
int main()
{int a,b,c,d,n;int miny,maxy;while(scanf("%d",&n)==1){int m=0;miny=10000;maxy=-10000;for(int i=0;i<n;i++){scanf("%d %d %d %d",&a,&b,&c,&d);miny=min(miny,b);maxy=max(maxy,d);ss[m++]=node(a,b,d,1);ss[m++]=node(c,b,d,-1);}sort(ss,ss+m);int ans=0,last=0;for(int i=0;i<m;i++){if(ss[i].y1<ss[i].y2)update(ss[i].y1,ss[i].y2-1,ss[i].s,miny,maxy-1,1);ans+=num[1]*(ss[i+1].x-ss[i].x);ans+=abs(len[1]-last);last=len[1];}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/nanke/archive/2011/10/02/2198044.html

hdu 1828 pku 1177 Picture相关推荐

  1. 【扫描线法】 poj 1177 hdu 1828

    可以看看这里: http://www.cnblogs.com/Booble/archive/2010/10/10/1847163.html 为了写扫描线, 大概写了有史以来最丑的线段树了. poj 1 ...

  2. HDU 1828 Picture 线段树 扫描线

    写完后才发现数据是int不是double... //#pragma comment(linker, "/STACK:1024000000,1024000000") #include ...

  3. HDU 1828:Picture(扫描线+线段树 矩形周长并)

    题目链接 题意 给出n个矩形,求周长并. 思路 学了区间并,比较容易想到周长并. 我是对x方向和y方向分别做两次扫描线.应该记录一个pre变量,记录上一次扫描的时候的长度,对于每次遇到扫描线统计答案的 ...

  4. Picture HDU - 1828 (扫描线求矩形周长并)

    题目连接:https://cn.vjudge.net/problem/HDU-1828 题意:给你n个矩形,让你求矩形的轮廓的周长之和 两遍扫描线从左到右,从下到上即可. #include <i ...

  5. HDU 1162 Eddy's picture (最小生成树)(java版)

    Eddy's picture 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 --每天在线,欢迎留言谈论. 题目大意: 给你N个点,求把这N个点 ...

  6. POJ 1177 Picture [离散化+扫描线+线段树]

    http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...

  7. 【转】POJ 1177 Picture(1)

    POJ_1177 这个题目和POJ_1151基本思路是一样的,一些具体的思路可以参考我的那篇题解:http://www.cnblogs.com/staginner/archive/2012/02/20 ...

  8. hdu 1102 pku 2421 解题报告

    这题很简单,我差不多15分钟就写好代码了,运行结果也是正确的.可提交就是RE,百思不得其解,调了两个小时的时候,我才忽然发现我存边的时候数组开小了,我当时也想到肯定是数组问题,但是我却忽律了图的边不等 ...

  9. POJ 1177 Picture

    POJ_1177 这个题目和POJ_1151基本思路是一样的,一些具体的思路可以参考我的那篇题解:http://www.cnblogs.com/staginner/archive/2012/02/20 ...

最新文章

  1. php调用execute,php运行生命周期--脚本执行阶段 php_execute
  2. 通知栏管理NotificationListenerService
  3. 二十六个月Android学习工作总结
  4. 微信红包随机数字_微信红包的随机算法
  5. array_multisort - 如何保持键值,不重置键值,键名保持不变
  6. spark调用python_在MRS集群中使用Python3.7运行PySpark程序,调用RDD的take函数报错处理...
  7. git 拉取远端仓库_git命令-远程仓库拉取、本地仓库更新、工作空间提交等等
  8. phpnow 更改mysql data文件夹路径
  9. android 获取屏幕的宽和高
  10. 2Y叔的clusterProfiler-book阅读Chapter 2 Functional Enrichment Analysis Methods
  11. JavaScript基础知识总结(1)
  12. 外卖行业现状分析_外卖行业生存现状分析:你还会点外卖吗?
  13. 如何高效学习和阅读源码?
  14. Android error: “Apostrophe not preceded by \” 解决办法
  15. 从雀书无代码应用——浅谈零代码开发平台(上)
  16. ToC产品和ToB产品的区别
  17. 欧拉是如何计算圆周率的
  18. google翻译不能用后chrome浏览器如何翻译网页
  19. python建立数据库连接时出错_python连接数据库
  20. 第八章 界面外观——Qt

热门文章

  1. 【深度学习入门到精通系列】遗传算法 (Genetic Algorithm)
  2. python【蓝桥杯vip练习题库】ADV-96复数求和
  3. 计算机专业的教学内容落后实例,关于中职计算机专业教学现状的思考.doc
  4. Java 生成滑动图片验证码, 阴影, 切块
  5. 基于Android的红外测温设计,基于Android的红外三维重构移动APP设计与实现
  6. 手机端网站排名优化需注意哪些细节?
  7. 网站优化之哪些设置会影响蜘蛛的爬取?
  8. 浅析企业网站建设的基本费用组成
  9. 浅析网站结构如何开启优化工作
  10. java 交换机_Java交换机案例:有或没有大括号?