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的更多相关文章

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

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

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

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

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

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

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

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

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

    看到一坨矩形就要想到扫描线.(poj atantis) 我们把横边竖边分开计算,因为横边竖边其实没有区别,以下论述全为考虑竖边的. 怎样统计一个竖边对答案的贡献呢?答:把这个竖边加入线段树,当前的总覆 ...

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

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

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

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

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

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

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

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

随机推荐

  1. asp.net core-3.应用程序部署到iis

    asp.net core在部署到iis 上的时候,iis服务器要装一个AspNetCoreModule,网站—>模块  具体下载地址可以去网上搜索https://www.nuget.org/pa ...

  2. javascript移动端 电子书 翻页效果

    1.后端给一长串的纯文本 2.前端根据屏幕的高度,将文本切割为 n 页 3.使用插件 turn.js 将切割好的每页,加上翻书效果 <!DOCTYPE html> <html lan ...

  3. Python操作Redis(转)

    原文1:https://cloud.tencent.com/developer/article/1151834 原文2:https://www.cnblogs.com/zhaohuhu/p/91406 ...

  4. 解决IIS出现“由于权限不足而无法读取配置文件”的问题

    在部署IIS项目的时候,今天突然遇到了如下问题: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效 详细错误信息: 由于权限 ...

  5. js 中的 深拷贝与浅拷贝

    js在平时的项目中,赋值操作是最多的:比如说: var person1 = { name:"张三", age:18, sex:"male", height:18 ...

  6. CentOS 系统 MySQL 5.7 开启远程连接

    CentOS 系统安装好 MySQL 后,默认情况下不支持用户通过非本机连接上数据库服务器,下面是解决方法: 1.在控制台执行 mysql -u root -p 系统提示输入数据库 root 用户的密 ...

  7. 动手实现CNN卷积神经网络

    数据集采用的是手写数据集(http://yann.lecun.com/exdb/mnist/): 本文构建的CNN网络图如下: 像素点:28*28 = 784,55000张手写数字图片. # -*- ...

  8. webpack最基本的使用方式

    1.创建文件夹"webpack-study" 2.使用webstrom打开文件夹所在位置.在根目录上创建一个文件,文件命名为“src”,在src文件下新建css.images.js ...

  9. Invariant Violation: requireNativeComponent: "RNCWKWebView" was not found in the UIManager.

    react-native  0.60以上版本安装第三方库的时候会autolink  出现这个问题是 我安装 react-native-webview 之后运行 ios出现的,这是因为ios 没有自动安 ...

  10. STL源码剖析 - RB-tree

    在我看来,看源码是一件既痛苦又兴奋的事.当我们在推敲其中的难点时,是及其痛苦的,但当发现实现代码是那么丝滑简洁时,“wc, nb!”. 1. 导语 如果我们去看关联式容器map.set.multima ...