POJ1177 Picture 线段树+离散化+扫描线
求最终的覆盖图形周长,写这种代码应该短而精确,差的比较远
/*
Problem: 1177 User: 96655
Memory: 348K Time: 32MS
Language: C++ Result: Accepted
*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include <algorithm>
using namespace std;
const int maxn=;
struct Node
{
int s,t,num,len,cover;
bool lb,rb;
void change(int o)
{
cover+=o;
if(cover==)len=lb=rb=num=;
else len=t-s,lb=,rb=,num=;
}
} node[maxn<<];
struct Line
{
int x,y1,y2,flag;
void fun(int a,int b,int c,int d)
{
x=a,y1=b,y2=c,flag=d;
}
bool operator<(const Line &e)const
{
if(x==e.x)
return flag>e.flag;
return x<e.x;
}
} line[maxn];
int y[maxn];
void build(int rt,int l,int r)
{
node[rt].s=y[l];
node[rt].t=y[r];
node[rt].num=node[rt].len=node[rt].cover=; if(l+==r)return;
int m=(l+r)>>;
build(rt*,l,m);
build(rt*+,m,r);
}
void update_line(int rt)
{
node[rt].lb=node[rt*].lb;
node[rt].rb=node[rt*+].rb;
node[rt].num=node[rt*].num+node[rt*+].num-node[rt*].rb*node[rt*+].lb;
}
void update_len(int rt)
{
node[rt].len=node[rt*].len+node[rt*+].len;
}
void update(int rt,int l,int r,Line e)
{
if(l+==r)
{
node[rt].change(e.flag);
return;
}
int m=(l+r)>>;
if(e.y1<node[rt*].t)update(rt*,l,m,e);
if(e.y2>node[rt*+].s)update(rt*+,m,r,e);
update_len(rt);
update_line(rt);
}
int main()
{
int n,x1,x2,y1,y2,cnt=,d=;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
line[++cnt].fun(x1,y1,y2,);
y[cnt]=y1;
line[++cnt].fun(x2,y1,y2,-);
y[cnt]=y2;
}
sort(y+,y++cnt);
sort(line+,line++cnt);
for(int i=; i<=cnt; ++i)
if(y[i]!=y[i-])y[++d]=y[i];
build(,,d);
int perimeter=;
int now_len=;
int now_num=;
for(int i=; i<=cnt; ++i)
{
update(,,d,line[i]);
if(i>)perimeter+=*now_num*(line[i].x-line[i-].x);
perimeter+=abs(node[].len-now_len);
now_num=node[].num;
now_len=node[].len;
}
printf("%d\n",perimeter);
return ;
}
POJ1177 Picture 线段树+离散化+扫描线的更多相关文章
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...
- hdu1542 矩形面积并(线段树+离散化+扫描线)
题意: 给你n个矩形,输入每个矩形的左上角坐标和右下角坐标. 然后求矩形的总面积.(矩形可能相交). 题解: 前言: 先说说做这道题的感受: 刚看到这道题顿时就懵逼了,几何 烂的渣渣.后来从网上搜题解 ...
- 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...
- POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]
Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21734 Accepted: 8179 Descrip ...
- hdu1542线段树+离散化+扫描线
参考博客: http://blog.csdn.net/xingyeyongheng/article/details/8927732 总的来说就是用一条(假想的)线段去平行x轴从下往上扫描,扫描的过程中 ...
- HDU 1542 线段树离散化+扫描线 平面面积计算
也是很久之前的题目,一直没做 做完之后觉得基本的离散化和扫描线还是不难的,由于本题要离散x点的坐标,最后要计算被覆盖的x轴上的长度,所以不能用普通的建树法,建树建到r-l==1的时候就停止,表示某段而 ...
- Codeforces 610D Vika and Segments 线段树+离散化+扫描线
可以转变成上一题(hdu1542)的形式,把每条线段变成宽为1的矩形,求矩形面积并 要注意的就是转化为右下角的点需要x+1,y-1,画一条线就能看出来了 #include<bits/stdc++ ...
随机推荐
- Nhibernate 多对多级联更新
问题是这样的,有两个表:文章(Article)和分类(Lable),这两者之间的关系是多对多关联,如果你用Nhibernate来保存数据的话非常的好操作,新建Article,然后把Lable值赋值给A ...
- 为什么dubbo使用ZkClient作为zookeeper的客户端
本文内容并非原创,使用资料均来自互联网. dubbo使用了zkClient而不是使用zookeeper本身的客户端与zookeeper进行交互,为什么呢? 先看看zookeeper本身自带的客户端的问 ...
- [转载]C#对象序列化与反序列化
文章写的实在是太好了,忍不住转来: http://www.cnblogs.com/LiZhiW/p/3622365.html#_Toc8478 1.对象序列化的介绍 (1).NET支持对象序列化的几种 ...
- Educational Codeforces Round 5 A
Problem A:http://codeforces.com/contest/616/problem/A A. Comparing Two Long Integers 果然还是我太天真了(长整数比较 ...
- tomcat安全设置
1.关闭服务器端口:server.xml默认有下面一行: <Server port="8005" shutdown="SHUTDOWN"> 这样允许 ...
- Android:控件ProgressBar进度条
各种进度条属于 ProgressBar的子类 设置style: 环形进度条 style="?android:attr/progressBarStyleLarge" 横向进度条, ...
- 新建arcgis api for android 项目失败
新建ArcGIS Project for Android项目失败解决方案 - skybot的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/daonidedie/a ...
- Android安全问题 静音拍照与被拍
之前写过一些android手机root之后的安全问题的(文章列表见末尾),其实我是想到哪就写到了,今天整理硬盘,发现一年之前写过一段代码,所以今天我们就一起来讨论一下. 注:这里不是讨论多nb的技术, ...
- ArcGIS Engine 几何对象和WKB的转换
using System; using System.Collections.Generic; using System.Text; using GisSharpBlog.NetTopologySui ...
- &&运算符和||运算符的优先级问题
package priority; public class TestAndOrPriority { /* * &&的优先级高就不代表 他会先运行 ||的右边 而是说会把右边用& ...