hdu1828(线段树+扫描线)
又知道了线段树的一种用法,除了单点更新,区间更新,还有这种在一段线段上标号但不往下推。 真是神奇
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <stdlib.h>
using namespace std;
#define N 5050 struct RECT
{
int x1,y1,x2,y2;
}g[N]; struct LINE
{
int k,b,d;
int flag;
}line[*N]; int ans=;
int n; int l[],r[],mark[],yb[],yd[],num[]; int cmp(LINE x,LINE y)
{
return x.k<y.k;
} void build(int tl,int tr,int s)
{
l[s]=tl; r[s]=tr;
mark[s]=;yb[s]=; yd[s]=; num[s]=;
if(tl==tr) return ;
int mid=(tl+tr)/;
build(tl,mid,*s);
build(mid+,tr,*s+);
} void up(int s)
{
if(mark[s]>)
{
num[s]=;
yb[s]=;
yd[s]=;
}
else
{
if(l[s]==r[s])
{
num[s]=;
yb[s]=;
yd[s]=;
}
else
{
if(yd[*s]==&&yb[*s+]==)
num[s]=num[*s]+num[*s+]-;
else num[s]=num[*s]+num[*s+];
yb[s]=yb[*s];
yd[s]=yd[*s+];
}
}
} void update(int tl,int tr,int sign,int s)
{
if(tl==l[s]&&tr==r[s])
{
mark[s]+=sign;
up(s);
return ;
}
int mid=(l[s]+r[s])/;
if(tr<=mid) update(tl,tr,sign,*s);
else if(tl>mid) update(tl,tr,sign,*s+);
else
{
update(tl,mid,sign,*s);
update(mid+,tr,sign,*s+);
}
up(s);
} void fuc()
{
int cnt=;
int mix=,mxx=-; for(int i=;i<n;i++)
{
line[cnt].k=g[i].y1;
line[cnt].b=g[i].x1;
line[cnt].d=g[i].x2-;//注意可能为负的
line[cnt].flag=;
cnt++; mix=min(mix,g[i].x1);
mxx=max(mxx,g[i].x2-); line[cnt].k=g[i].y2;
line[cnt].b=g[i].x1;
line[cnt].d=g[i].x2-;
line[cnt].flag=-;
cnt++;
}
sort(line,line+cnt,cmp);
build(mix,mxx,);
for(int i=;i<cnt-;i++)
{
update(line[i].b,line[i].d,line[i].flag,);
ans += (line[i+].k-line[i].k)**num[];
}
} int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<n;i++)
{
scanf("%d%d%d%d",&g[i].x1,&g[i].y1,&g[i].x2,&g[i].y2);
g[i].x1+=;
g[i].x2+=;
g[i].y1+=;
g[i].y2+=;
}
if(n==)
{
printf("0\n");
continue;
}
ans=;
fuc();
//
for(int i=;i<n;i++)
{
swap(g[i].x1,g[i].y1);
swap(g[i].x2,g[i].y2);
}
fuc();
printf("%d\n",ans);
}
return ;
}
hdu1828(线段树+扫描线)的更多相关文章
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- hdu1828 Picture(线段树+扫描线+矩形周长)
看这篇博客前可以看一下扫描线求面积:线段树扫描线(一.Atlantis HDU - 1542(覆盖面积) 二.覆盖的面积 HDU - 1255(重叠两次的面积)) 解法一·:两次扫描线 如图我们可以 ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
- 线段树扫描线(一、Atlantis HDU - 1542(覆盖面积) 二、覆盖的面积 HDU - 1255(重叠两次的面积))
扫描线求周长: hdu1828 Picture(线段树+扫描线+矩形周长) 参考链接:https://blog.csdn.net/konghhhhh/java/article/details/7823 ...
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)
题目链接:http://codeforces.com/contest/522/problem/D 题目大意: 给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...
- 【POJ-2482】Stars in your window 线段树 + 扫描线
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11706 Accepted: ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤
3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...
随机推荐
- nodeJs入门篇之认识nodejs
摘要:将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开 ...
- Stacked injection--堆叠注入--堆查询注入
Stacked injection--堆叠注入--堆查询注入 原文地址;http://www.sqlinjection.net/stacked-queries/ 本篇属于集合原作者的思路和个人想法 ...
- 解决Ubuntu下内存不足---作为Slave的虚拟机
1)在虚拟机上安装了Ubuntu桌面版作为DataNode,由于物理机内存的限制只是分了1G的内存给虚拟机,使用bin/start-all.sh启动了hadoop之后,Slave的资源使用情况如下图所 ...
- 【一】php 操作符
1.php单引号和双引号的区别 单引号和双引号都能表示字符串,但是单引号不能识别里面带有转义字符'/'和变量的字符串,所以需要""去表示这种字符串.或者使用<<< ...
- POJ 1547
#include<iostream> #include<string> using namespace std; int main() { int length; int hi ...
- Install WindowBuilder for Eclipse
WindowBuilder官方下载安装说明地址:http://www.eclipse.org/windowbuilder/download.php 先祝各位能顺利安装上!以下是基于Eclipse in ...
- JDBC 程序的常见错误及调试方法
详细介绍:http://dev.mysql.com/doc/refman/5.5/en/error-handling.html http://dev.mysql.com/doc/refman/5.5/ ...
- Codeforces Round #337 (Div. 2) C. Harmony Analysis 数学
C. Harmony Analysis The semester is already ending, so Danil made an effort and decided to visit a ...
- easyUI Admin 模板
http://www.oschina.net/p/Easy-Admin?fromerr=23Tfbale
- HTML基本操作
插入图片: 1.利用链接(静态) <img src="http://www.kmwzjs.com/useruploads/images/20101020_057600100825157 ...