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所 ...
随机推荐
- vue 模拟后台数据(加载本地json文件)调试
首先创建一个本地json文件,放在项目中如下 { "runRedLight":{ "CurrentPage": 1, "TotalPages" ...
- qconbeijing2017
http://2017.qconbeijing.com/schedule 第一天 (2017年4月16日/星期日) 签到 专题 主题演讲 快速进化的容器生态 微服务与 DevOps 最佳实践(厂商 ...
- Retrofit Upload multiple files and parameters
Retrofit 的介绍以及基本使用 这里不再说明. 关于多文件上传 以及上传文件的同时携带多个参数说明 网上涉及到的不是太多. 上一张帅图: 代码: apiService: /** params 参 ...
- 【前端】Html5浏览器缓存 sessionStorage 与 localStorage
一.sessionStorage: 浏览关闭会话结束就被清除:(不能跨页面) localStorage:永久保存: 二.使用 var storage = window.sessionStorage; ...
- AJPFX关于面向对象之封装,继承,多态 (下)
(3)private: 对于对于成员来说:只能在该成员隶属于的类中访问. 对于类来说:类不可以声明为private. 4)protected: 对于对于成员来说:相同包中的类可以访问(包访问权限):基 ...
- objectbox基础
objectbox基础 参考链接 官网地址 http://objectbox.io github地址 https://github.com/objectbox/objectbox-java https ...
- iOS infoq资料架构设计漫谈
http://www.infoq.com/cn/ios/?utm_source=infoq&utm_medium=header_graybar&utm_campaign=topic_c ...
- easybcd 支持 windows 10 和 ubuntu 14.04 双系统启动
家里计算机系统 windows 10 全新安装. 原本是双系统的,还有一个ubuntu. windows 10 安装以后,恢复ubuntu就是问题了. (事后经验:请不要立刻安装bcd修改工具) 最初 ...
- 在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图
在Jerry写这篇文章时,通过Google才知道,SAP其实是有自己的3D模型视图显示解决方案的. 故事要从Right Hemisphere说起,这是一家专业的企业级2D/3D模型浏览及转换的软件供应 ...
- leetcode_1039. Minimum Score Triangulation of Polygon_动态规划
https://leetcode.com/problems/minimum-score-triangulation-of-polygon/ 题意:给定一个凸的N边形(N<=50),每个顶点有一个 ...