[9018_1963][IOI_1998]Picture
题目描述
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的更多相关文章
- 基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?
复现过程 首先,我创建了一个基于Picture Library的图片文档库,名字是 Pic Lib 创建完毕后,我点击它的Upload 下拉菜单,点击Upload Picture按钮 在弹出的对话框中 ...
- MFC Picture控件加载图片
CStatic *pPic = (CStatic*)GetDlgItem(IDC_PICTURE); CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP2); ...
- [POJ1177]Picture
[POJ1177]Picture 试题描述 A number of rectangular posters, photographs and other pictures of the same sh ...
- USACO 5.5 Picture(周长并)
POJ最近做过的原题. /* ID: cuizhe LANG: C++ TASK: picture */ #include <cstdio> #include <cstring> ...
- 彩色照片转换为黑白照片(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 ...
- HDU 1828 Picture(线段树扫描线求周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- don't forget the bigger picture
Imagine a circle that contains all of human knowledge: By the time you finish elementary school, you ...
- 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 ...
- HDUOJ-----(1162)Eddy's picture(最小生成树)
Eddy's picture Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
随机推荐
- easyPOI导出excel报错
http-nio--exec- at :: - excel cell export error ,data is :com.jn.ssr.superrescue.web.qc.dto.Automati ...
- tomcat7 配置 https安全访问
在apache-tomcat-7.0.33-windows-x64.zip配置https,结果在配置SSL时遇到一些问题 1.用JDK自带的keytool来生成私有密钥和自签发的证书,如下: keyt ...
- Android开发——事件分发机制详解
0. 前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52566965 深入学习事件分发机制,是为了解决在Android开发中 ...
- Erlang中常用的类型转换[转]
转自: http://blog.sina.com.cn/s/blog_53a5047b01018yqv.html 例子 结果 atom_to_list(hello). "hello" ...
- Google浏览器历史版本下载地址和驱动器对应关系地址分享
Google浏览器历史版本下载地址https://www.slimjet.com/chrome/google-chrome-old-version.php google webdriver下载地址分享 ...
- 4.实现简单的shell sed替换功能
# -*- coding:utf-8 -*- # Author: JACK ZHAO # 程序1: 实现简单的shell sed替换功能 import sys #判断参数个数 if len(sys.a ...
- cloud-init介绍及源码解读
https://zhuanlan.zhihu.com/p/27664869 知乎大神写的
- Linux cooked-mode capture 格式转换
tcpdump抓包时,如果-i选项指定为一个网卡地址,那么抓取的数据包数据链路层是以太网头部:如果指定any,则以太网头部将被替换为linux cooked capture头部 # tcpdump - ...
- HDU 4474 Yet Another Multiple Problem ( BFS + 同余剪枝 )
没什么巧办法,直接搜就行. 用余数作为每个节点的哈希值. #include <cstdio> #include <cstring> #include <cstdlib&g ...
- JavaWeb笔记(四)Cookie&Session
Cookie 客户端会话技术,客户端保存,用于存储少量不太敏感的数据,在不登陆的情况下完成服务器对客户端的身份识别 简单使用步骤 创建Cookie对象,绑定数据 new Cookie(String n ...