[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 ...
随机推荐
- 数据结构学习-AVL平衡树
环境:C++ 11 + win10 IDE:Clion 2018.3 AVL平衡树是在BST二叉查找树的基础上添加了平衡机制. 我们把平衡的BST认为是任一节点的左子树和右子树的高度差为-1,0,1中 ...
- strak组件(8):基本增删改查实现及应用和排序
效果图: 新增函数: def reverse_common_url(self, name, *args, **kwargs) 反向生成url,需要传增删改的url作为参数,携带原参数 def reve ...
- SQL Server 数据库内部版本号
数据库还原或版本升级出现版本错误时可参考 可以利用SQL语句查看本机数据库版本:select @@VERSION 如果你不确定是源数据库的版本,下面的映射表的SQL Server版本的内部版本号,以便 ...
- C语言字符篇(五)内存函数
memcpy不可以把目的地址写成本身 但是memmove可以,因为它是先保存到临时空间 #include <string.h> void *memcpy(void *dest, con ...
- P2580 于是他错误的点名开始了(trie)
P2580 于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉 ...
- 《Cracking the Coding Interview》——第9章:递归和动态规划——题目3
2014-03-20 03:01 题目:给定一个已按升序排序的数组,找出是否有A[i] = i的情况出现. 解法1:如果元素不重复,是可以严格二分查找的. 代码: // 9.3 Given a uni ...
- Django笔记 —— 入门简介
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- 超链接标签的CSS伪类link,visited,hover,active
CSS伪类,是一种特殊的类,它针对到CSS选择器起作用,使选中的标签或元素产生特定的效果. CSS伪类的语法就是: 选择器 : 伪类名 { 属性 : 属性值 } 用的最多的伪类就是超链接a的伪类,有: ...
- 【Spiral Matrix II】cpp
题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. ...
- Percona-Tookit工具包之pt-table-usage
Preface There always be some table join operations in our SQL statement.Although we can know ...