1. //扫描线矩形周长的并 POJ1177
  2. // 我是按x轴
  3.  
  4. #include <iostream>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <cmath>
  10. #include <cstring>
  11. // #include <memory.h>
  12. // #include <bits/stdc++.h>
  13. using namespace std;
  14. #define LL long long
  15. typedef pair<int,int> pii;
  16. const LL inf = 0x3f3f3f3f;
  17. const LL MOD =100000000LL;
  18. const int N = ;
  19. const double eps = 1e-;
  20. void fre() {freopen("in.txt","r",stdin);}
  21. void freout() {freopen("out.txt","w",stdout);}
  22. inline int read() {int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-; ch=getchar();}while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}return x*f;}
  23.  
  24. struct node{
  25. int x1,x2,y;
  26. int flag;
  27. bool operator < (const node &a) const{
  28. return y<a.y||(y==a.y&&flag>a.flag);
  29. }
  30. }e[N<<];
  31.  
  32. int color[N<<];
  33. int sum[N<<],hashh[N<<];
  34. int cnt[N<<],pl[N<<],pr[N<<];
  35. void pushup(int rt,int l,int r){
  36. if(color[rt]) {
  37. sum[rt]=hashh[r+]-hashh[l];
  38. cnt[rt]=;
  39. pl[rt]=pr[rt]=;
  40. }
  41. else if(l!=r) {
  42. sum[rt]=sum[rt<<]+sum[rt<<|];
  43. cnt[rt]=cnt[rt<<]+cnt[rt<<|]-(pr[rt<<]&&pl[rt<<|]);
  44. pr[rt]=pr[rt<<|];
  45. pl[rt]=pl[rt<<];
  46. }
  47. else sum[rt]=cnt[rt]=pl[rt]=pr[rt]=;
  48. }
  49. void update(int l,int r,int L,int R,int rt,int f){
  50. if(l<=L&&R<=r){
  51. color[rt]+=f;
  52. pushup(rt,L,R);
  53. return;
  54. }
  55. int mid=(L+R)>>;
  56. if(l<=mid) update(l,r,L,mid,rt<<,f);
  57. if(r>mid) update(l,r,mid+,R,rt<<|,f);
  58. pushup(rt,L,R);
  59. }
  60.  
  61. int main(){
  62. // fre();
  63. int n;
  64. scanf("%d",&n);
  65. memset(color,,sizeof(color));
  66. memset(sum,,sizeof(sum));
  67. memset(cnt,,sizeof(cnt));
  68. memset(pr,,sizeof(pr));
  69. memset(pl,,sizeof(pl));
  70. int x1,x2,y1,y2;
  71. for(int i=;i<=n;i++){
  72. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  73. e[i*-].x1=e[i*].x1=x1;
  74. e[i*-].x2=e[i*].x2=x2;
  75. e[i*-].y=y1,e[i*].y=y2;
  76. e[i*-].flag=,e[i*].flag=-;
  77. hashh[i*-]=x1,hashh[i*]=x2;
  78. }
  79. sort(e+,e++*n);
  80. sort(hashh+,hashh++*n);
  81. int ans=;
  82. int lastsum=;
  83. e[].y=e[].y;
  84. for(int i=;i<=*n;i++){
  85. ans+=(e[i].y-e[i-].y)**cnt[];
  86. int l=lower_bound(hashh+,hashh++*n,e[i].x1)-hashh;
  87. int r=lower_bound(hashh+,hashh++*n,e[i].x2)-hashh-;
  88. if(l<=r) update(l,r,,*n,,e[i].flag);
  89. ans+=abs(sum[]-lastsum);
  90. lastsum=sum[];
  91. }
  92. printf("%d\n",ans);
  93. return ;
  94. }

扫描线矩形周长的并 POJ1177的更多相关文章

  1. hdu 1828 Picture(线段树扫描线矩形周长并)

    线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

  2. hdu1828 Picture(线段树+扫描线+矩形周长)

    看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积))  解法一·:两次扫描线 如图我们可以 ...

  3. HDU 1828 扫描线(矩形周长并)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线

    51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...

  5. P1856 [USACO5.5]矩形周长Picture[扫描线]

    题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...

  6. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

  7. 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有

    package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...

  8. HDU 1828 / POJ 1177 Picture --线段树求矩形周长并

    题意:给n个矩形,求矩形周长并 解法:跟求矩形面积并差不多,不过线段树节点记录的为: len: 此区间线段长度 cover: 此区间是否被整个覆盖 lmark,rmark: 此区间左右端点是否被覆盖 ...

  9. HDU 6362(求椭圆中矩形周长的期望 数学)

    题意是给定一个椭圆标准方程的a,b(椭圆的长半轴长和短半轴长),在[0,b]内取一个数,则过点(0,b)且平行于x轴的直线与椭圆交于两点,再将此两点关于x轴做对称点,顺次连接此四点构成矩形,求出这些矩 ...

随机推荐

  1. 01_springboot2.x之springboot入门

    1.简介 Spring Boot来简化Spring应用开发,约定大于配置, 去繁从简,just run就能创建一个独立的,产品级别的应用. 优点: 1.简化Spring应用开发的一个框架: 2.整个S ...

  2. 滑雪 矩阵中的最长上升路径 /// 记忆化DFS || DP oj22919

    大致题意: Description 难怪Michael喜欢滑雪,因为滑雪确实很刺激.为了获得加速度,滑雪道必须向下倾斜,而且当滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一 ...

  3. Django static静态配置文件

    对于Django来说静态文件一般交由Web服务器处理,Django本身不处理静态文件.为了使Django开发环境能够处理静态文件,Django有和生产环境不同的静态文件配置方式. Django 版本: ...

  4. 记录一次工作中配置的Mysql主从复制过程

    Mysql主从复制教程 1.安装mysql(安装步骤跳过)2.配置密码.(如果忘记密码或者误操作删除了root用户,使用如下命令,没有忘记就跳到3)将skip-grant-tables放在/etc/m ...

  5. vue/cli 3.0脚手架搭建

    在vue 2.9.6中,搭建vue-cli脚手架的流程是这样的: 首先 全局安装vue-cli,在cmd中输入命令: npm install --global vue-cli  安装成功:  安装完成 ...

  6. SoapUI测试接口【转】

    下载安装soapUI工具,具体安装按照提示往下走就可以,这里不着重说明,下面是我打开soapUI工具的起始窗口:  在Projects上鼠标右键点击,选择new soap project(新建一个SO ...

  7. 【JZOJ3301】家族

    description 阿狸和桃子养了n 个小阿狸, 小阿狸们每天都在一起玩的很开心. 作为工程师的阿狸在对小阿狸们之间的关系进行研究以后发现了小阿狸的人际关系由某种神奇的相互作用决定, 阿狸称之为& ...

  8. 日志服务Python消费组实战(二):实时分发数据

    场景目标 使用日志服务的Web-tracking.logtail(文件极简).syslog等收集上来的日志经常存在各种各样的格式,我们需要针对特定的日志(例如topic)进行一定的分发到特定的logs ...

  9. F. Cowmpany Cowmpensation dp+拉格朗日插值

    题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项, ...

  10. Lydsy2017省队十连测

    5215: [Lydsy2017省队十连测]商店购物 可能FFT学傻了,第一反应是前面300*300背包,后面FFT... 实际上前面背包,后面组合数即可.只是这是一道卡常题,需要注意常数.. //A ...