[USACO5.5] 矩形周长Picture
https://www.luogu.org/problemnew/show/P1856
1.每个矩形由两条横向边和两条纵向边组成.
2.对于横向边,按纵坐标排序。设当前讨论的边为 A [s , t]
如果 A 是某个矩形的靠下的边,在树中查询[s,t]区间中被覆盖的长度为x,那么加上这条边后将增加(t-s-x);
如果 A 是某个矩形的靠上的边,先删除它的对应边,再在树中查询[s,t]区间中被覆盖的长度为x,那么加上这条边后将增加(t-s-x);
3、对于纵向边,按横坐标排序,讨论方法与横向边相同。
注意建树方式是以单位线段为叶子节点
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath> #define LL long long using namespace std;
const int MAXN = 2e4 + ;
const int INF = 1e9; int n,m,Ans = ; #define Max 10001 inline void read(int &x){
x=; int f=; register char c = getchar();
while(c>''||c<''){ if(c=='-')f=-; c=getchar(); }
while(c>=''&&c<=''){ x=x*+c-''; c=getchar(); } x*=f;
} struct Seg_Ment{
int s,t,id,p; // s、t线段端点 p是排序依据 id--排序之前的编号
Seg_Ment(int a,int b,int c,int d):s(a),t(b),p(c),id(d){}
Seg_Ment(){ s=t=p=id=; }
bool operator < (const Seg_Ment a) const {
return p < a.p;
}
}x[MAXN],y[MAXN]; int lazy[MAXN << ],cnt[MAXN << ],l,r; inline void Push_Down(int u){
int ls = u << ,rs = u << |;
lazy[ls] += lazy[u],cnt[ls] += lazy[u],cnt[rs] += lazy[u],lazy[rs] += lazy[u];
lazy[u] = ;
} void UpDate(int u,int L,int R,int Del){
if(lazy[u]) Push_Down(u);
if(l <= L && R <= r){
cnt[u] += Del,lazy[u] += Del;
}
else if(L + < R){
int Mid = (L+R) >>,ls = u<<,rs = u<<|;
if(l <= Mid && L <= r) UpDate(ls,L,Mid,Del);
if(r >= Mid && l <= R) UpDate(rs,Mid,R,Del);
}
} int query(int u,int L,int R){
if(lazy[u]) Push_Down(u);
if(l <= L && R <= r && cnt[u] > ) return R - L;
if(L + < R){
int Mid = L+R >>,a = ,b = ;
if(l <= Mid) a = query(u<<,L,Mid);
if(r >= Mid) b = query(u<<|,Mid,R);
return a + b;
}
return ;
} int main(int argc,char *argv[]){
freopen("gg.out", "w", stdout);
cin >> n;
for(int i = ; i <= n; i ++) {
cout << i << ":" << " " << tan(i) << endl;
}
return ;
int x1,y1,xx,yy;
read(n);
for(int i=; i<=n; ++i){
read(x1),read(y1),read(xx),read(yy);
x1 += Max,xx += Max,y1 += Max, yy += Max;
x[i] = Seg_Ment(x1,xx,y1,i),y[i] = Seg_Ment(y1,yy,x1,i);
x[i + n] = Seg_Ment(x1,xx,yy,i + n),y[i + n] = Seg_Ment(y1,yy,xx,i + n);
} return ;
sort(x + ,x + * n + );
sort(y + ,y + * n + );
memset(lazy,,sizeof lazy ); memset(cnt,,sizeof cnt );
for(int i=; i<=n * ; ++i){
l = x[i].s, r = x[i].t;
if(x[i].id <= n){
Ans += abs(r - l - query(,,MAXN));
UpDate(,,MAXN,);
}
else {
UpDate(,,MAXN,-);
Ans += abs(r - l - query(,,MAXN));
}
}
memset(lazy,,sizeof lazy ); memset(cnt,,sizeof cnt );
for(int i=; i<=n * ; ++i){
l = y[i].s,r = y[i].t;
if(y[i].id <= n){
Ans += abs(r - l - query(,,MAXN));
UpDate(,,MAXN,);
}
else{
UpDate(,,MAXN,-);
Ans += abs(r - l - query(,,MAXN));
}
}
cout << Ans << endl;
return ;
}
[USACO5.5] 矩形周长Picture的更多相关文章
- 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 ...
- luogu1856 [USACO5.5]矩形周长Picture
看到一坨矩形就要想到扫描线.(poj atantis) 我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的. 怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆 ...
- Luogu P1856 [USACO5.5]矩形周长Picture
线段树+扫描线 经典的扫描线问题 首先将一个矩形看作由竖着的两条边和横着的两条边构成 那分成两次考虑,一次考虑竖边,一次考虑横边 首先考虑横边 如图两个矩形,现将横边擦去,留下竖边,将平面划分成3个区 ...
- [题解]P1856 [USACO5.5]矩形周长Picture
Loli 考试的题目之一 题目地址 \(N^2\)做法 #include <cstdio> #include <cstring> #define re register #de ...
- Luogu1856 [USACO5.5]矩形周长Picture (线段树扫描线)
对于横轴,加上与上一次扫描的差值:对于竖轴,加上高度差与区间内不相交线段\(*2\)的积: 难点在pushdown,注意维护覆盖关系.再就注意负数 #include <iostream> ...
- 「USACO5.5」矩形周长Picture
题目描述 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 编写一个程序计算周长. 如图1所示7个矩形. 如图2所 ...
随机推荐
- asp.net core-3.应用程序部署到iis
asp.net core在部署到iis 上的时候,iis服务器要装一个AspNetCoreModule,网站—>模块 具体下载地址可以去网上搜索https://www.nuget.org/pa ...
- javascript移动端 电子书 翻页效果
1.后端给一长串的纯文本 2.前端根据屏幕的高度,将文本切割为 n 页 3.使用插件 turn.js 将切割好的每页,加上翻书效果 <!DOCTYPE html> <html lan ...
- Python操作Redis(转)
原文1:https://cloud.tencent.com/developer/article/1151834 原文2:https://www.cnblogs.com/zhaohuhu/p/91406 ...
- 解决IIS出现“由于权限不足而无法读取配置文件”的问题
在部署IIS项目的时候,今天突然遇到了如下问题: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效 详细错误信息: 由于权限 ...
- js 中的 深拷贝与浅拷贝
js在平时的项目中,赋值操作是最多的:比如说: var person1 = { name:"张三", age:18, sex:"male", height:18 ...
- CentOS 系统 MySQL 5.7 开启远程连接
CentOS 系统安装好 MySQL 后,默认情况下不支持用户通过非本机连接上数据库服务器,下面是解决方法: 1.在控制台执行 mysql -u root -p 系统提示输入数据库 root 用户的密 ...
- 动手实现CNN卷积神经网络
数据集采用的是手写数据集(http://yann.lecun.com/exdb/mnist/): 本文构建的CNN网络图如下: 像素点:28*28 = 784,55000张手写数字图片. # -*- ...
- webpack最基本的使用方式
1.创建文件夹"webpack-study" 2.使用webstrom打开文件夹所在位置.在根目录上创建一个文件,文件命名为“src”,在src文件下新建css.images.js ...
- Invariant Violation: requireNativeComponent: "RNCWKWebView" was not found in the UIManager.
react-native 0.60以上版本安装第三方库的时候会autolink 出现这个问题是 我安装 react-native-webview 之后运行 ios出现的,这是因为ios 没有自动安 ...
- STL源码剖析 - RB-tree
在我看来,看源码是一件既痛苦又兴奋的事.当我们在推敲其中的难点时,是及其痛苦的,但当发现实现代码是那么丝滑简洁时,“wc, nb!”. 1. 导语 如果我们去看关联式容器map.set.multima ...