luogu1856 [USACO5.5]矩形周长Picture
看到一坨矩形就要想到扫描线。(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的更多相关文章
- Luogu1856 [USACO5.5]矩形周长Picture (线段树扫描线)
对于横轴,加上与上一次扫描的差值:对于竖轴,加上高度差与区间内不相交线段\(*2\)的积: 难点在pushdown,注意维护覆盖关系.再就注意负数 #include <iostream> ...
- P1856 [USACO5.5]矩形周长Picture
P1856 [USACO5.5]矩形周长Picture $len$ $sum$ $num$ $flag\_l$ $flage\_ ...
- P1856 [USACO5.5]矩形周长Picture[扫描线]
题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...
- 洛谷P1856 [USACO5.5]矩形周长Picture
题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...
- luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树
Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void ...
- [USACO5.5] 矩形周长Picture
https://www.luogu.org/problemnew/show/P1856 1.每个矩形由两条横向边和两条纵向边组成. 2.对于横向边,按纵坐标排序.设当前讨论的边为 A [s , t] ...
- Luogu P1856 [USACO5.5]矩形周长Picture
线段树+扫描线 经典的扫描线问题 首先将一个矩形看作由竖着的两条边和横着的两条边构成 那分成两次考虑,一次考虑竖边,一次考虑横边 首先考虑横边 如图两个矩形,现将横边擦去,留下竖边,将平面划分成3个区 ...
- [题解]P1856 [USACO5.5]矩形周长Picture
Loli 考试的题目之一 题目地址 \(N^2\)做法 #include <cstdio> #include <cstring> #define re register #de ...
- 「USACO5.5」矩形周长Picture
题目描述 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 编写一个程序计算周长. 如图1所示7个矩形. 如图2所 ...
随机推荐
- Python %s和%r的区别
%s 用str()方法处理对象 %r 用rper()方法处理对象,打印时能够重现它所代表的对象(rper() unambiguously recreate the object it represen ...
- 洛谷 P2759 奇怪的函数
https://www.luogu.org/problemnew/show/P2759 #include<cstdio> #include<algorithm> #includ ...
- 今天发现一个汉字转换成拼音的模块,记录一下,直接pip install xpinyin即可
http://blog.csdn.net/qq_33232071/article/details/50915760
- AJPFX关于java的依赖 关联 聚合的关系解释
依赖: 两个相对独立的系统,当一个系统要构筑另一个系统的实例,或者依赖另一的服务时,这两个就是依赖关系.比如自行车和打气筒之间就是依赖关系.代码表现形式如下: public class A{ ...
- re正则表达式2
1.“字符*” 匹配*前面的字符0次或者多次. 注意:是匹配*前一个字符,只能是*前一个字符多次打印出来.*前面其他的字符相当于前缀会打印出来,但是不会再匹配. *前一个字符前面的其他字符里的首字符先 ...
- Scala 学习记录(一)
1. 相对于java,scala的值修饰用val,变量修饰用var.值相当于java的final 修饰了. package demo object ScalaBase extends App { pr ...
- 【HEVC帧间预测论文】P1.2 An Efficient Inter Mode Decision Approach for H.264 Video Codin
参考:An Efficient Inter Mode Decision Approach for H.264 Video Coding <HEVC标准介绍.HEVC帧间预测论文笔记>系列博 ...
- Linux下搭建DHCP服务器
一.DHCP所需软件包 dhcp-common-4.1.1-34.Pl.el6.centos.x86_64 dhcp-4.1.1-34.pl.el6.centon.x86_64 二.编辑主配置文件 v ...
- Web开发者不容错过的10个HTML5工具
HTML5已经成为当今世界的一个必然组成部分.由于World Wide Web万维网是使用超文本标记语言来架构和呈现的,于是HTML5成为了最流行的编程语言之一.随着网络的不断扩张,Web开发人员非常 ...
- 我所理解的MVVM
将UI中的数据适配.交互处理: controller中与UI密切相关的功能: 剥离出来,形成单独的模块: 以增加UI和Controller的灵活性.