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. Python开发【第七章】:异常处理

    一.异常处理 1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! #异常处理 list = [&qu ...

  2. (九)Activitivi5之使用 RuntimeService 设置和获取流程变量

    一.案例 /** * 设置流程变量数据 */ @Test public void setVariableValues(){ RuntimeService runtimeService=processE ...

  3. .htaccess 转 SAE AppConfig

    新浪的SAE不支持 htaccess,但是他们开发了 AppConfig,可以完全代替 htaccess 的常见功能,AppConfig采用类自然语言的规则描述,还是很人性化的. 这里来写一个短网址的 ...

  4. JS 长按 移动端

    实质上,长按的时间不应该过长,因为这有可能与手机系统的部分长按手势产生冲突,但也不宜过短,因为长按时间过短与点击没有任何区别, 理论上,判断长按结束,在手机端上仅设置mouseup动作就可以, < ...

  5. CPCT精细化运营:客户、产品、渠道、时机

    关键词:CPCT.精细化运营思维.客户.产品.渠道.时机.运营 电信运营商市场饱和,用户新增主要靠弃卡后重新入网以及异网用户策反. 用户新增已如此艰难,所以更加关注存量用户经营. 运营商营销资源不断收 ...

  6. XSS学习收集

    XSS platform supporting HTTPShttps://www.w0ai1uo.org/xss/xss.php?do=loginhttps://x.secbox.cn/index.p ...

  7. 【转】xshell 5评估期已过,不能访问的解决方案

    原文:https://blog.csdn.net/u010826617/article/details/79165540 重新安装Home & school 版本,原来访问的服务器信息不会丢失 ...

  8. 一个页面,WEB全功能

    当鼠标在页面上往下滑动的时候,页面也一直向下,标签也顺带着全部向下滑动 以前浏览页面,主要是在PC上进行浏览,一个页面不适于太长,需要用户向下拖动: 当时的设计是,点击标签,点击不同的标签,跳转到不同 ...

  9. idou老师教你学istio 21:基于角色的访问控制

    istio的授权功能,也称为基于角色的访问控制(RBAC),它为istio服务网格中的服务提供命名空间级别.服务级别和方法级别的访问控制.基于角色的访问控制具有简单易用.灵活和高性能等特性.本文介绍如 ...

  10. 记录一下set的用法

    set译为集合,是一个内部自动有序且不含重复元素的容器 有时出现需要去掉重复元素的情况 而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表 在这种情况下就可以用set来保留元素本身而不考 ...