题目描述

N(N<5000) 张矩形的海报,照片和其他同样形状的图片贴在墙上。它们的边都是垂直的或水平的。每个矩形可以部分或者全部覆盖其他矩形。所有的矩形组成的集合的轮廓称为周长。写一个程序计算周长。

所有矩形的顶点坐标均为整数。所有的坐标都在 [-10000,10000] 的范围内,并且任何一个矩形面积都为整数。结果的值可能需要 32 位有符号整数表示。

输入

第1行: N,张贴在墙上的矩形的数目。 第 2..N+1行 接下来的N行中,每行都有两个点的坐标,分别是矩形的左下角坐标和右上角坐标。每一个坐标由 X 坐标和 Y 坐标组成。

输出

只有一行,为一个非负整数,表示输入数据中所有矩形集合的轮廓长度。

样例输入

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

样例输出

228

题解:

线段树+扫描线

对于每条线段,分横竖考虑,排序,坐标第一关键字,左右第2关键字

对于矩形左边线段,先统计这条线段区域0的个数,在把线段树中这条线段覆盖的区域+1,右边反过来

一定要记得右端点-1(因为题目给的是点,实际上是区间)

例如1,3。其实只覆盖2个区间(1,2;2,3)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct data1{
int l,r,k,p;
}x[],y[];
struct data2{
int x,s,l,r,la;
}tree[];
int n;
bool cmp(data1 a,data1 b)
{
if(a.k==b.k)return a.p>b.p;
return a.k<b.k;
}
void down(int x)
{
tree[x*].x+=tree[x].la;
tree[x*].la+=tree[x].la;
tree[x*+].x+=tree[x].la;
tree[x*+].la+=tree[x].la;
tree[x].la=;
}
void up(int x)
{
tree[x].x=min(tree[x*].x,tree[x*+].x);
if(tree[x*].x==tree[x*+].x)tree[x].s=tree[x*].s+tree[x*+].s;
if(tree[x*].x<tree[x*+].x)tree[x].s=tree[x*].s;
if(tree[x*].x>tree[x*+].x)tree[x].s=tree[x*+].s;
}
void init(int x,int l,int r)
{
tree[x].l=l;tree[x].r=r;tree[x].la=;tree[x].x=;
if(l==r){tree[x].s=;return;}
init(x*,l,(l+r)/);init(x*+,(l+r)/+,r);
up(x);
}
void add(int x,int l,int r,int k)
{
if(tree[x].l==l&&tree[x].r==r){tree[x].x+=k;tree[x].la+=k;return;}
down(x);
int mid=(tree[x].l+tree[x].r)/;
if(r<=mid)add(x*,l,r,k);
else if(l>mid)add(x*+,l,r,k);
else {add(x*,l,mid,k);add(x*+,mid+,r,k);}
up(x);
}
void query(int x,int l,int r,int &ansx,int &anss)
{
if(tree[x].l==l&&tree[x].r==r)
{
if(ansx==tree[x].x)anss+=tree[x].s;
if(tree[x].x<ansx)anss=tree[x].s;
ansx=min(ansx,tree[x].x);return;
}
down(x);
int mid=(tree[x].l+tree[x].r)/;
if(r<=mid)query(x*,l,r,ansx,anss);
else if(l>mid)query(x*+,l,r,ansx,anss);
else {query(x*,l,mid,ansx,anss);query(x*+,mid+,r,ansx,anss);}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int _x1,_y1,_x2,_y2;
scanf("%d%d%d%d",&_x1,&_y1,&_x2,&_y2);
_x1+=;_x2+=;_y1+=;_y2+=;
y[i*-].l=_x1;y[i*-].r=_x2-;y[i*-].k=_y1;y[i*-].p=;
y[i*].l=_x1;y[i*].r=_x2-;y[i*].k=_y2;y[i*].p=-;
x[i*-].l=_y1;x[i*-].r=_y2-;x[i*-].k=_x1;x[i*-].p=;
x[i*].l=_y1;x[i*].r=_y2-;x[i*].k=_x2;x[i*].p=-;
}
n*=;int ans=;
sort(x+,x+n+,cmp);sort(y+,y+n+,cmp);
init(,,);
for(int i=;i<=n;i++)
{
if(x[i].p==-)add(,x[i].l,x[i].r,-);
int anss=,ansx=;query(,x[i].l,x[i].r,ansx,anss);
if(x[i].p==)add(,x[i].l,x[i].r,);
if(ansx==)ans+=anss;
}
init(,,);
for(int i=;i<=n;i++)
{
if(y[i].p==-)add(,y[i].l,y[i].r,-);
int anss=,ansx=;query(,y[i].l,y[i].r,ansx,anss);
if(y[i].p==)add(,y[i].l,y[i].r,);
if(ansx==)ans+=anss;
}
cout<<ans;return ;
}

[9018_1963][IOI_1998]Picture的更多相关文章

  1. 基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?

    复现过程 首先,我创建了一个基于Picture Library的图片文档库,名字是 Pic Lib 创建完毕后,我点击它的Upload 下拉菜单,点击Upload Picture按钮 在弹出的对话框中 ...

  2. MFC Picture控件加载图片

    CStatic *pPic = (CStatic*)GetDlgItem(IDC_PICTURE); CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP2); ...

  3. [POJ1177]Picture

    [POJ1177]Picture 试题描述 A number of rectangular posters, photographs and other pictures of the same sh ...

  4. USACO 5.5 Picture(周长并)

    POJ最近做过的原题. /* ID: cuizhe LANG: C++ TASK: picture */ #include <cstdio> #include <cstring> ...

  5. 彩色照片转换为黑白照片(Color image converted to black and white picture)

    This blog will be talking about the color image converted to black and white picture. The project st ...

  6. HDU 1828 Picture(线段树扫描线求周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  7. don't forget the bigger picture

    Imagine a circle that contains all of human knowledge: By the time you finish elementary school, you ...

  8. A Complete Guide to the <Picture> Element

    If you’ve ever struggled building responsive websites, this post is for you. It’s part of a series o ...

  9. HDUOJ-----(1162)Eddy's picture(最小生成树)

    Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

随机推荐

  1. Aizu:0009- Prime Number

    Prime Number Time limit 1000 ms Memory limit 131072 kB Problem Description Write a program which rea ...

  2. パラメータID一覧

    名称 内容 ABK 処理グループ. AUF 受注伝票タイプ. AVE FI:支払明細通知書のテンプレート登録. BAR 伝票タイプ. BNK 銀行コード. BUK 会社コード. CAC 管理領域. D ...

  3. Apache 设置二级域名

    开启重写模块 LoadModule rewrite_module modules/mod_rewrite.so 编辑配置 NameVirtualHost *:80 <VirtualHost *: ...

  4. ST表学习

    啊谈不上学习了.复习一下原理留一下板子. $f\left[i,j \right]$表示以$i$为起点,区间长度为${2}^{j}$的区间最值.以最小值为例,即 $min\left(a\left [ k ...

  5. Spring---配置文件概述

    概述 Spring 的配置文件是用于指导 Spring 工厂进行Bean的生产.依赖关系注入及 Bean 实例分发的“图纸”,它是一个或多个标准的XML文档,J2EE 程序员必须学会并灵活应用这份“图 ...

  6. win32 signal

    Remarks   The signal function enables a process to choose one of several ways to handle an interrupt ...

  7. 【Support Vector Regression】林轩田机器学习技法

    上节课讲了Kernel的技巧如何应用到Logistic Regression中.核心是L2 regularized的error形式的linear model是可以应用Kernel技巧的. 这一节,继续 ...

  8. python中os.path.join和join的区别

    这两个函数都是python的系统函数,都有“组合”.“连接”之意,但用法和应用场景千差万别 函数说明: 1.join函数 用法:用于连接字符串数组.将字符串.元组.列表中的元素以指定的字符(即分隔符) ...

  9. [译]如何禁止Requests库的log日志信息呢?

    原文来源: https://stackoverflow.com/questions/11029717/how-do-i-disable-log-messages-from-the-requests-l ...

  10. thinkphp3.2 学习笔记 基础篇

    环境要求:PHP5.3以上版本注意:PHP5.3DEV和php6不支持 目录结构 www WEB部署目录(或者子目录)├─index.php 入口文件├─README.md README文件├─App ...