题目背景

墙上贴着许多形状相同的海报、照片。它们的边都是水平和垂直的。每个矩形图片可能部分或全部的覆盖了其他图片。所有矩形合并后的边长称为周长。

题目描述

编写一个程序计算周长。

如图1所示7个矩形。

如图2所示,所有矩形的边界。所有矩形顶点的坐标都是整数。

输入输出格式

输入格式:

输入文件的第一行是一个整数N(0<=N<5000),表示有多少个矩形。接下来N行给出了每一个矩形左下角坐标和右上角坐标(所有坐标的数值范围都在-10000到10000之间)。

输出格式:

输出文件只有一个正整数,表示所有矩形的周长。

输入输出样例

输入样例#1: 复制

7
-15 0 5 10
-5 8 20 25
15 -4 24 14
0 -6 16 4
2 15 10 22
30 10 36 20
34 0 40 16
输出样例#1: 复制

228

扫描线线段树

其实能够找到的一些题解的线段树都暴力的很,如果稍微数据强一点就能卡,但是这题数据实在是太弱了QAQ

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<vector>
#define MAXN 5005
#define MAXM 10005
#define X first
#define Y second
#define pii pair<int,int>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if('-'==ch)f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct Node{
int L,R,p,b;
Node(int p1=,int p2=,int p3=,int p4=){
L=p1,R=p2,p=p3,b=p4;
}
};
bool comp(const Node &p1,const Node &p2){
if(p1.p!=p2.p){
return (p1.p<p2.p);
}
else{
return (p1.b>p2.b);
}
}
int n;
vector<Node> vx,vy;
void init(){
n=read();
for(int i=;i<=n;i++){
int x1=read(),y1=read(),x2=read(),y2=read();
x1+=,y1+=,x2+=,y2+=;
vx.push_back(Node(x1,x2,y1,));vx.push_back(Node(x1,x2,y2,-));
vy.push_back(Node(y1,y2,x1,));vy.push_back(Node(y1,y2,x2,-));
}
sort(vx.begin(),vx.end(),comp);sort(vy.begin(),vy.end(),comp);
n=*;
}
int dat[MAXM<<],tag[MAXM<<];
void pushdown(int k){
int lc=(k<<),rc=(k<<|);
dat[lc]+=tag[k],dat[rc]+=tag[k];
tag[lc]+=tag[k],tag[rc]+=tag[k];
tag[k]=;
}
void pushup(int k){
dat[k]=min(dat[k<<],dat[k<<|]);
}
void add(int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
dat[k]+=x;
tag[k]+=x;
}
else{
if(tag[k]){
pushdown(k);
}
add(a,b,k<<,L,(L+R)>>,x);
add(a,b,k<<|,(L+R)>>,R,x);
pushup(k);
}
}
int query(int a,int b,int k,int L,int R){
if(b<=L||R<=a){
return ;
}
if(L+==R){
return (dat[k]?:);
}
else if(a<=L&&R<=b&&dat[k]){
return R-L;
}
else{
if(tag[k]){
pushdown(k);
}
int lc=query(a,b,k<<,L,(L+R)>>);
int rc=query(a,b,k<<|,(L+R)>>,R);
return (lc+rc);
}
}
int Abs(int x){
return (x>?x:-x);
}
void solve(){
int ans=;
for(int i=;i<vx.size();i++){
int x=vx[i].L,y=vx[i].R,b=vx[i].b;
int cnt1=query(x,y,,,n+);
add(x,y,,,n+,b);
int cnt2=query(x,y,,,n+);
ans+=Abs(cnt1-cnt2);
// printf("%d ",Abs(cnt1-cnt2));
}
// printf("\n");
for(int i=;i<vy.size();i++){
int x=vy[i].L,y=vy[i].R,b=vy[i].b;
int cnt1=query(x,y,,,n+);
add(x,y,,,n+,b);
int cnt2=query(x,y,,,n+);
ans+=Abs(cnt1-cnt2);
// printf("%d ",Abs(cnt1-cnt2));
}
printf("%d\n",ans);
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
init();
solve();
return ;
}

洛谷P1856 [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. luogu P1856 [USACO5.5]矩形周长Picture 扫描线 + 线段树

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

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

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

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

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

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

    https://www.luogu.org/problemnew/show/P1856 1.每个矩形由两条横向边和两条纵向边组成. 2.对于横向边,按纵坐标排序.设当前讨论的边为 A [s , t] ...

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

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

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

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

  9. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

随机推荐

  1. 【Alpha版本】冲刺阶段 - Day4 - 加速

    今日进展 袁逸灏:实现音乐的播放.(5h) 启动类,游戏画面类(修改类) 刘伟康:继续借鉴其他 alpha 冲刺博客,了解了Android方面的部分内容,便于更好地推进进度.(2h) 刘先润:更新图画 ...

  2. 20155215 第二周测试1 与 myod

    课堂测试 第一题 每个.c一个文件,每个 .h一个文件,文件名中最好有自己的学号 用Vi输入图中代码,并用gcc编译通过 在Vi中使用K查找printf的帮助文档 提交vi编辑过程截图,要全屏,包含自 ...

  3. 201621123062《java程序设计》第14周作业总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 思维导图: 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的 ...

  4. Linux下C编写基本的多线程socket服务器

    不想多说什么,会搜这些东西的都是想看代码的吧. 一开始不熟悉多线程的时候还在想怎么来控制一个线程的结束,后来发现原来有pthread_exit()函数可以直接在线程函数内部调用结束这个线程. 开始还想 ...

  5. NumPy简介

    NumPy是什么? NumPy(Numerrical Python 的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然的使用数组.NumPy包含很多实用的数学函数,涵盖线性代数运 ...

  6. bzoj千题计划245:bzoj1095: [ZJOI2007]Hide 捉迷藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=1095 查询最远点对,带修改 显然可以用动态点分治 对于每个点,维护两个堆 堆q1[x] 维护 点分树 ...

  7. selenium多个标签页的切换(弹出新页面的切换)

    1_windows = driver.current_window_handle #定位当前页面句柄 all_handles = driver.window_handles #获取全部页面句柄 for ...

  8. Python-函数-Day4

    1.函数 1.1.集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 a = {1,2,3,4} b ={3,4,5,6} a {1, 2, 3, 4} type(a) <c ...

  9. cookie中存中文

    cookie中存中文 1:想要在cookie中存中文:需要用到URLEncoder(在jdkAPI中有介绍) Cookie cookie = new Cookie("User",U ...

  10. 基于session认证 相亲小作业

    基于session认证  相亲小作业 用户登录 如果男用户登录,显示女生列表 如果女用户登录,显示男生列表 urls ===========================urls========== ...