[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 ...
随机推荐
- SPOJ1026 概率DP
Favorite Dice BuggyD loves to carry his favorite die around. Perhaps you wonder why it's his favorit ...
- git重新下载项目
file-new-project from version control - git 修改网址为需要的网址
- urllib使用一
urllib.urlopen()方法: 参数: 1.url(要访问的网页链接http:或者是本地文件file:) 2.data(如果有,就会由GET方法变为POST方法,提交的数据格式必须是appli ...
- js石头剪刀布小游戏
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...
- cocos2d-x 3.0 Node与Node层级结构
节点解释: 节点是场景图的基本元素.场景图的基本元素必须是节点对象或者是节点对象的子类. 其中主要可以看到Layer.MenuItem.Scene.Sprite.TMXTiledMap(解析and渲染 ...
- Service Intent must be explicit
参考: http://blog.csdn.net/qs_csu/article/details/45114251 我做阿里云账号登录的时候,遇到一个问题,不知道阿里云服务的包名.怎么办?第二种方法可以 ...
- angular 模块化之directive
通过使用directive使页面模块化.需要哪部分直接调用即可.原本这些操作需要后端配合,现在前端即可.将原本的html代码拆为不同的模块,然后通过directive衔接加载到主页面中.首先页面通过d ...
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目2
2014-04-23 17:45 题目:假设有个呼叫中心,有接线员.经理.主管三种角色.如果接线员无法处理呼叫,就上传给经理:如果仍无法处理,则上传给主管.请用代码描述这一过程. 解法:第一眼觉得这题 ...
- 《数据结构》C++代码 散列表
散列表,又名哈希表.Hash表.这是一个神奇的数据结构,它的复杂度是常数级别,由于我非常喜欢这个数据结构,在此简单介绍一下. (没有学过Hash表的同学,我推荐一个教程:http://www.cnbl ...
- eclipse里导入maven项目有红叉的解决办法
导入maven的项目上有红叉,说明eclipse里maven的插件该更新了 1.help里选择install new software 2.点击add,输入name:MavenArchiver, lo ...