对于横轴,加上与上一次扫描的差值;对于竖轴,加上高度差与区间内不相交线段\(*2\)的积;

难点在pushdown,注意维护覆盖关系。再就注意负数

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #define R(a,b,c) for(register int a = (b); a <= (c); ++ a)
  7. #define nR(a,b,c) for(register int a = (b); a >= (c); -- a)
  8. #define Max(a,b) ((a) > (b) ? (a) : (b))
  9. #define Min(a,b) ((a) < (b) ? (a) : (b))
  10. #define Fill(a,b) memset(a, b, sizeof(a))
  11. #define Abs(a) ((a) < 0 ? -(a) : (a))
  12. #define Swap(a,b) a^=b^=a^=b
  13. #define ll long long
  14. #define ON_DEBUG
  15. #ifdef ON_DEBUG
  16. #define D_e_Line printf("\n\n----------\n\n")
  17. #define D_e(x) cout << #x << " = " << x << endl
  18. #define Pause() system("pause")
  19. #else
  20. #define D_e_Line ;
  21. #endif
  22. struct ios{
  23. template<typename ATP>ios& operator >> (ATP &x){
  24. x = 0; int f = 1; char c;
  25. for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
  26. while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
  27. x*= f;
  28. return *this;
  29. }
  30. }io;
  31. using namespace std;
  32. #define lson rt << 1, l, mid
  33. #define rson rt << 1 | 1, mid + 1, r
  34. const int N = 20007;
  35. struct Line{
  36. int l, r, h, tag;
  37. bool operator < (const Line &com)const{
  38. if(h != com.h) return h < com.h;
  39. return tag > com.tag;
  40. }
  41. }a[N];
  42. struct Tree{
  43. int sum, num, len, ltag, rtag;
  44. }t[N << 2];
  45. inline void Pushdown(int rt, int l, int r){
  46. if(t[rt].sum){
  47. t[rt].num = 1;
  48. t[rt].len = r - l + 1;
  49. t[rt].ltag = t[rt].rtag = 1;
  50. return;
  51. }
  52. if(l == r){
  53. t[rt].len = 0;
  54. t[rt].num = 0;
  55. t[rt].ltag = t[rt].rtag = 0;
  56. return;
  57. }
  58. t[rt].len = t[rt << 1].len + t[rt << 1 | 1].len;
  59. t[rt].num = t[rt << 1].num + t[rt << 1 | 1].num;
  60. if(t[rt << 1].rtag && t[rt << 1 | 1].ltag) --t[rt].num;
  61. t[rt].ltag = t[rt << 1].ltag;
  62. t[rt].rtag = t[rt << 1 | 1].rtag;
  63. }
  64. inline void Updata(int rt, int l, int r, int L, int R, int w){
  65. if(L <= l && r <= R){
  66. t[rt].sum += w;
  67. Pushdown(rt, l, r);
  68. return;
  69. }
  70. int mid = (l + r) >> 1;
  71. if(L <= mid) Updata(lson, L, R, w);
  72. if(R > mid) Updata(rson, L, R, w);
  73. Pushdown(rt, l, r);
  74. }
  75. int main(){
  76. int n, m = 0;
  77. io >> n;
  78. int maxx = 0xcfcfcfcf, minn = 0x7fffffff;
  79. R(i,1,n){
  80. int X1, Y1, X2, Y2;
  81. io >> X1 >> Y1 >> X2 >> Y2;
  82. maxx = Max(maxx, X2);
  83. minn = Min(minn, X1);
  84. a[++m] = (Line){X1, X2, Y1, 1};
  85. a[++m] = (Line){X1, X2, Y2, -1};
  86. }
  87. if(minn <= 0){
  88. R(i,1,m){
  89. a[i].l -= minn - 1;
  90. a[i].r -= minn - 1;
  91. }
  92. maxx -= minn - 1;
  93. }
  94. sort(a + 1, a + m + 1);
  95. int ans = 0, last = 0;
  96. R(i,1,m){
  97. Updata(1, 1, maxx, a[i].l, a[i].r - 1, a[i].tag);
  98. while(a[i].h == a[i + 1].h && a[i].tag == a[i + 1].tag){
  99. ++i;
  100. Updata(1, 1, maxx, a[i].l, a[i].r - 1, a[i].tag);
  101. }
  102. ans += Abs(t[1].len - last) + (t[1].num * (a[i + 1].h - a[i].h) << 1);
  103. last = t[1].len;
  104. }
  105. printf("%d\n",ans);
  106. return 0;
  107. }

Luogu1856 [USACO5.5]矩形周长Picture (线段树扫描线)的更多相关文章

  1. luogu1856 [USACO5.5]矩形周长Picture

    看到一坨矩形就要想到扫描线.(poj atantis) 我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的. 怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆 ...

  2. P1856 [USACO5.5]矩形周长Picture

    P1856 [USACO5.5]矩形周长Picture $len$            $sum$              $num$             $flag\_l$ $flage\_ ...

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

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

  4. Luogu P1856 [USACO5.5]矩形周长Picture

    线段树+扫描线 经典的扫描线问题 首先将一个矩形看作由竖着的两条边和横着的两条边构成 那分成两次考虑,一次考虑竖边,一次考虑横边 首先考虑横边 如图两个矩形,现将横边擦去,留下竖边,将平面划分成3个区 ...

  5. luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树

    Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void ...

  6. 洛谷P1856 [USACO5.5]矩形周长Picture

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

  7. POJ 1177 Picture(线段树 扫描线 离散化 求矩形并面积)

    题目原网址:http://poj.org/problem?id=1177 题目中文翻译: 解题思路: 总体思路: 1.沿X轴离散化建树 2.按Y值从小到大排序平行与X轴的边,然后顺序处理 如果遇到矩形 ...

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

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

  9. HDU1255 覆盖的面积 —— 求矩形交面积 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1255 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<= ...

随机推荐

  1. 报‘galleryElements’

    是因为组件的data(){ //没有return{ }引起的 }

  2. SMFL 教程&个人笔记

    本文大部分来自官方教程的Google翻译 但是加了一点点个人的理解和其他相关知识 转载请注明 原文链接 :https://www.cnblogs.com/Multya/p/16273753.html ...

  3. 第06组Alpha冲刺(6/6)

    目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2.曹兰英 3. 方梓涵 4.曾丽莉 5.鲍凌函 6.杜筱 7.黄少丹 8.詹鑫冰 9.董翔云 10.吴沅静 1.3 冲刺成果展示 1.1 基 ...

  4. springcloud-- Alibaba-nacos--支持的几种服务消费方式

    通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现>一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBal ...

  5. model.apply(fn)或net.apply(fn)

    详情可参考:https://pytorch.org/docs/1.11/generated/torch.nn.Module.html?highlight=torch%20nn%20module%20a ...

  6. wcf .net webService和 .net webApi的联系与差异

    首先,我们需要清楚它们的概念,然后才能走好下一步. wcf是对于ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等技术的整合,它是一种重量级消息交互框架,广 ...

  7. DAST 黑盒漏洞扫描器 第六篇:运营篇(终)

    0X01 前言 转载请标明来源:https://www.cnblogs.com/huim/ 当项目功能逐渐成熟,同时需要实现的是运营流程和指标体系建设.需要工程化的功能逐渐少了,剩下的主要工作转变成持 ...

  8. 换根 DP 学习笔记

    前言 没脑子选手什么都不会. 正文 先来写一下换根 DP 的特点或应用方面: 不同的点作为树的根节点,答案不一样. 求解答案时要求出每一个节点的信息. 无法通过一次搜索完成答案的求解,因为一次搜索只能 ...

  9. string的底层实现

    String底层实现 string在C++也是一个重要的知识,但是想要用好它,就要知道它的底层是如何写的,才能更好的用好这个string,那么这次就来实现string的底层,但是string的接口功能 ...

  10. 如何参与开源项目 - 细说 GitHub 上的 PR 全过程

    目录 一.概述 二.为什么要参与开源项目 三.为什么我想介绍如何 PR 四.我想参与开源项目,怎么开始? 4.1.寻找一个合适的开源项目 4.2.寻找贡献点 五.我要提交 PR,怎么上手? 5.1.第 ...