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

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

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

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

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, qwq1, pwp1, qwq2, pwp2, cnt, m, num[20005], ans;
struct Line{
int uu, vv, ww, id;
}li1[10005], li2[10005];
bool cmp(Line x, Line y){
if(x.uu!=y.uu) return x.uu<y.uu;
else return x.id>y.id;
}
struct SGT{
int sum[80005], len[80005];
void update(int o, int l, int r, int x, int y, int k){
if(num[l]>=x && num[r]<=y) sum[o] += k;
else{
int mid=(l+r)>>1;
int lson=o<<1;
int rson=lson|1;
if(x<num[mid]) update(lson, l, mid, x, y, k);
if(num[mid]<y) update(rson, mid, r, x, y, k);
}
if(sum[o]>0) len[o] = num[r] - num[l];
else if(l+1==r) len[o] = 0;
else len[o] = len[o<<1] + len[(o<<1)|1];
}
}sgt;
int main(){
cin>>n;
for(int i=-10000; i<=10000; i++) num[++m] = i;
for(int i=1; i<=n; i++){
scanf("%d %d %d %d", &qwq1, &pwp1, &qwq2, &pwp2);
cnt++;
li1[cnt] = (Line){qwq1, pwp1, pwp2, 1};
li2[cnt] = (Line){pwp1, qwq1, qwq2, 1};
cnt++;
li1[cnt] = (Line){qwq2, pwp1, pwp2, -1};
li2[cnt] = (Line){pwp2, qwq1, qwq2, -1};
}
sort(li1+1, li1+1+cnt, cmp);
sort(li2+1, li2+1+cnt, cmp);
for(int i=1; i<=cnt; i++){
int lst=sgt.len[1];
sgt.update(1, 1, m, li1[i].vv, li1[i].ww, li1[i].id);
ans += abs(sgt.len[1]-lst);
}
for(int i=1; i<=cnt; i++){
int lst=sgt.len[1];
sgt.update(1, 1, m, li2[i].vv, li2[i].ww, li2[i].id);
ans += abs(sgt.len[1]-lst);
}
cout<<ans<<endl;
return 0;
}

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. AtCoder Grand Contest 010 F - Tree Game

    题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...

  2. Contextual Action bar(3) 两个示例

    一.通过activity启动Context Action Bar 1.主java public class ActivityActionModeFrgmt extends Fragment imple ...

  3. Object类的几个方法

    1.protected Object clone()创建并返回此对象的一个副本. 2. boolean equals(Object obj)指示其他某个对象是否与此对象“相等”. 3. protect ...

  4. ios 从相册视频中获取视频截图

    //给image添加个分类 +(UIImage *)getImage:(NSURL: *)videoURL { AVURLAsset *asset = [[AVURLAsset alloc] init ...

  5. iOS UI异步更新:dispatch_async 与 dispatch_get_global_queue 的使用方法

    GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开 ...

  6. Struts2 前端与后台之间传值问题

    老是被前端与后台之间的传值给弄糊涂了,特此写一篇blog进行总结. 一. 前端向后台传值 (1)属性驱动 属性驱动是指在Action类里,包含表单里对应的字段(字段名称一样),同时设置对应的gette ...

  7. 原创:Nginx反向代理实战部署

    均衡负载服务器 10.0.0.9 [root@web03 conf]# vim nginx.conf worker_processes  1; events { worker_connections  ...

  8. (转)用@Resource注解完成属性装配

    http://blog.csdn.net/yerenyuan_pku/article/details/52858878 前面我们讲过spring的依赖注入有两种方式: 使用构造器注入. 使用属性set ...

  9. (转)Spring如何装配各种集合类型的属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52858499 在前面我们已经会注入基本类型对象和其他bean,现在我们就来学习如何注入各种集合 ...

  10. Dreamoon and MRT(二元枚举)

    题目 数轴上有M个点a1.a2....am,另有一个数列p1.p2....pn,(1 ≤ pii ≤ M). 给定d1.d2....dn,对所有的 i (1 ≤ i ≤ n),已知 |api+1 - ...