看到一坨矩形就要想到扫描线。(poj atantis)

我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的。

怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆盖长度 减去 加入前的总覆盖长度 的绝对值 即为这个竖边的贡献。

这样做有一个要求,横坐标相同的竖边,要先加进去入边再删掉出边。(为什么呢?考虑两个矩形,一个矩形的右边和另一个矩形的左边的横坐标相同但上下错落)

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. using namespace std;
  6. int n, qwq1, pwp1, qwq2, pwp2, cnt, m, num[20005], ans;
  7. struct Line{
  8. int uu, vv, ww, id;
  9. }li1[10005], li2[10005];
  10. bool cmp(Line x, Line y){
  11. if(x.uu!=y.uu) return x.uu<y.uu;
  12. else return x.id>y.id;
  13. }
  14. struct SGT{
  15. int sum[80005], len[80005];
  16. void update(int o, int l, int r, int x, int y, int k){
  17. if(num[l]>=x && num[r]<=y) sum[o] += k;
  18. else{
  19. int mid=(l+r)>>1;
  20. int lson=o<<1;
  21. int rson=lson|1;
  22. if(x<num[mid]) update(lson, l, mid, x, y, k);
  23. if(num[mid]<y) update(rson, mid, r, x, y, k);
  24. }
  25. if(sum[o]>0) len[o] = num[r] - num[l];
  26. else if(l+1==r) len[o] = 0;
  27. else len[o] = len[o<<1] + len[(o<<1)|1];
  28. }
  29. }sgt;
  30. int main(){
  31. cin>>n;
  32. for(int i=-10000; i<=10000; i++) num[++m] = i;
  33. for(int i=1; i<=n; i++){
  34. scanf("%d %d %d %d", &qwq1, &pwp1, &qwq2, &pwp2);
  35. cnt++;
  36. li1[cnt] = (Line){qwq1, pwp1, pwp2, 1};
  37. li2[cnt] = (Line){pwp1, qwq1, qwq2, 1};
  38. cnt++;
  39. li1[cnt] = (Line){qwq2, pwp1, pwp2, -1};
  40. li2[cnt] = (Line){pwp2, qwq1, qwq2, -1};
  41. }
  42. sort(li1+1, li1+1+cnt, cmp);
  43. sort(li2+1, li2+1+cnt, cmp);
  44. for(int i=1; i<=cnt; i++){
  45. int lst=sgt.len[1];
  46. sgt.update(1, 1, m, li1[i].vv, li1[i].ww, li1[i].id);
  47. ans += abs(sgt.len[1]-lst);
  48. }
  49. for(int i=1; i<=cnt; i++){
  50. int lst=sgt.len[1];
  51. sgt.update(1, 1, m, li2[i].vv, li2[i].ww, li2[i].id);
  52. ans += abs(sgt.len[1]-lst);
  53. }
  54. cout<<ans<<endl;
  55. return 0;
  56. }

luogu1856 [USACO5.5]矩形周长Picture的更多相关文章

  1. Luogu1856 [USACO5.5]矩形周长Picture (线段树扫描线)

    对于横轴,加上与上一次扫描的差值:对于竖轴,加上高度差与区间内不相交线段\(*2\)的积: 难点在pushdown,注意维护覆盖关系.再就注意负数 #include <iostream> ...

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

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

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

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

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

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

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

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

  6. [USACO5.5] 矩形周长Picture

    https://www.luogu.org/problemnew/show/P1856 1.每个矩形由两条横向边和两条纵向边组成. 2.对于横向边,按纵坐标排序.设当前讨论的边为 A [s , t] ...

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

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

  8. [题解]P1856 [USACO5.5]矩形周长Picture

    Loli 考试的题目之一 题目地址 \(N^2\)做法 #include <cstdio> #include <cstring> #define re register #de ...

  9. 「USACO5.5」矩形周长Picture

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

随机推荐

  1. IE下png图片黑边问题

    png图片在ie8下有黑色边框的情况想必大家都有遇到过吧,那么该怎么解决呢?其实很简单,下面的方法或许对大家有所帮助 background-image:url(******.png)!importan ...

  2. Contextual Action bar(1) CAB in Android

    Contextual Action bar (CAB) in Android BY PARESH MAYANI - OCTOBER, 23RD 2013 Before getting into the ...

  3. git部分指令

    git stash #会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录 git stach pop #恢复之前缓存的工作目录 切换分支: git checkout de ...

  4. 129 Sum Root to Leaf Numbers 求根叶数字总和

    给定一个只包含 0-9 数字的二叉树,每个根到叶的路径可以代表一个数字.例如,从根到叶路径 1->2->3则代表数字 123.查找所有根到叶数字的总和.例如,    1   / \  2  ...

  5. 生成HTML表格的后台模板代码

    有时候,我们需要在后台拼接生成前端的html表格,一般的做法就是各种string.StringBuilder的拼接(例子省略...),这样的话如果表头不同就没法做到代码的重用,增加代码的冗余,下面我分 ...

  6. 亲身经历,Java面试题整理

    博主在2015年暑期参加过一些Java开发工程师实习的面试和笔试,在此将重点整理出来,以供大家学习. 资料1: 一.单继承 1.1Java类是否支持多重继承? 答:继承的基本原则是: 子类继承父类的所 ...

  7. 磁盘格式化mke2fs

    -b 设置每个块的大小,当前支持1024,2048,40963种字节 -i 给一个inode多少容量 -c 检查磁盘错误,仅执行一次-c时候,会进行快速读取测试:-c -c会测试读写,会很慢 -L 后 ...

  8. sc服务查询

    sc query lanmanse2rver |find /i "state" |find /i "running" || ( echo 该服务没有运行时,要执 ...

  9. 获取页面URL两种方式

    以请求http://localhost:8080/doctor/demo?code=1为例 一:用java代码获取 //获取URL中的请求参数.即?后的条件 code=1 String querySt ...

  10. 工作中Git使用笔记

    git相关说明. //git 安装$ git config --global user.name "xxx"代码提交时的用户名,与GITLAB注册用户名建议保持一致$ git co ...