矩形面积并,一个拆成四个

#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std; const long long maxn=+;
struct Seg
{
long long x;
long long Y1,Y2;//离散化之后的坐标
long long flag;
}s[*maxn];
long long X1[*maxn],X2[*maxn],Y1[*maxn],Y2[*maxn];
map<long long ,long long>m;
long long M[*maxn];long long k;
long long n,tot,N;
long long sum,ans; struct SegTree
{
long long len;
long long cover;
} segTree[maxn*]; bool cmp(const Seg&a,const Seg&b)
{
return a.x<b.x;
} void lsh()
{
k=;
m.clear();
for(long long i=; i<N; i++)
{
if(m[Y1[i]]==) M[k++]=Y1[i],m[Y1[i]]=;
if(m[Y2[i]]==) M[k++]=Y2[i],m[Y2[i]]=;
}
sort(M,M+k);
m.clear();
for(long long i=; i<k; i++) m[M[i]]=i;
} void build(long long l,long long r,long long rt)
{
segTree[rt].cover=;
segTree[rt].len=;
if(l==r) return;
long long m=(l+r)/;
build(l,m,*rt);
build(m+,r,*rt+);
} void pushUp(long long rt,long long l,long long r)
{
if(segTree[rt].cover) segTree[rt].len=M[r]-M[l-];
else segTree[rt].len=segTree[*rt].len+segTree[*rt+].len;
} void update(long long info,long long L,long long R,long long l,long long r,long long rt)
{
if(L<=l&&r<=R)
{
segTree[rt].cover=segTree[rt].cover+info;
pushUp(rt,l,r);
return;
} long long m=(l+r)/;
if(L<=m) update(info,L,R,l,m,*rt);
if(R>m) update(info,L,R,m+,r,*rt+);
pushUp(rt,l,r);
} int main()
{ while(~scanf("%lld",&n))
{
if(n==) break;
N=;
for(long long i=; i<=n; i++)
{
long long a1,a2,a3,a4,b1,b2,b3,b4;
scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&a1,&b1,&a2,&b2,&a3,&b3,&a4,&b4);
if(b3>b1&&a2>a1){
X1[N]=a1,Y1[N]=b1;
X2[N]=a2,Y2[N]=b3;
N++;} if(b2>b4&&a2>a1){
X1[N]=a1,Y1[N]=b4;
X2[N]=a2,Y2[N]=b2;
N++;} if(a3>a1&&b4>b3){
X1[N]=a1,Y1[N]=b3;
X2[N]=a3,Y2[N]=b4;
N++;} if(a2>a4&&b4>b3){
X1[N]=a4,Y1[N]=b3;
X2[N]=a2,Y2[N]=b4;
N++;}
}
if(N==)
{
printf("0\n");
continue;
}
lsh(); tot=;
for(long long i=; i<N; i++)
{
s[tot].x=X1[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=,tot++;
s[tot].x=X2[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=-,tot++;
}
sort(s,s+tot,cmp); ans=; build(,k,);
update(s[].flag,s[].Y1+,s[].Y2,,k,);
for(long long i=; i<tot; i++)
{
sum=segTree[].len;
ans=ans+sum*(s[i].x-s[i-].x);
update(s[i].flag,s[i].Y1+,s[i].Y2,,k,);
} printf("%lld\n",ans);
}
return ;
}

HDU 3265 Posters的更多相关文章

  1. HDU 3265 Posters(线段树)

    HDU 3265 Posters pid=3265" target="_blank" style="">题目链接 题意:给定一些矩形海报.中间有 ...

  2. HDU 3265 Posters (线段树+扫描线)(面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 给你n个中间被挖空了一个矩形的中空矩形,让你求他们的面积并. 其实一个中空矩形可以分成4个小的矩 ...

  3. (中等) HDU 3265 Posters , 扫描线。

    Problem Description Ted has a new house with a huge window. In this big summer, Ted decides to decor ...

  4. hdu 3265 Posters(线段树+扫描线+面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 题意:给你一张挖了洞的墙纸贴在墙上,问你总面积有多少. 挖了洞后其实就是多了几个矩形墙纸,一张墙 ...

  5. HDU 3265 Posters ——(线段树+扫描线)

    第一次做扫描线,然后使我对线段树的理解发生了动摇= =..这个pushup写的有点神奇.代码如下: #include <stdio.h> #include <algorithm> ...

  6. HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)

    Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...

  7. HDU 3265 扫描线(矩形面积并变形)

    Posters Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. hdu 3265 矩形剪块面积并

    http://acm.hust.edu.cn/vjudge/problem/10769 给n张海报,在每张海报上剪掉一个矩形,求面积并 把剪块的海报分成四个矩形,就是普通的求面积并问题了 #inclu ...

  9. hdu 3265 第一类斯特林数

    先和第二类做一个对比 第一类Stirling数是有正负的,其绝对值是包含n个元素的集合分作k个环排列的方法数目.递推公式为, S(n,0) = 0, S(1,1) = 1. S(n+1,k) = S( ...

随机推荐

  1. ios 修改程序显示名称

    当你创建一个project时,会要求你输入product name & company identifier,这两个property的值should和你在apple developer mem ...

  2. psy 2

    PSY,心理线,顾名思义,庄家要洗筹必须打破市场尤其是散户的心理防线,才能让大家乖乖的交出筹码.月线的心理线尤其重要,PSY有几个数值,16,25,33,41,50,66,75.PSY的运用也是抓大黑 ...

  3. shell 变量说明

    变量说明 $$Shell本身的PID(ProcessID)$!Shell最后运行的后台Process的PID$?最后运行的命令的结束代码(返回值)$-使用Set命令设定的Flag一览$*所有参数列表. ...

  4. 【威佐夫博奕】 betty定理 poj 1067

    Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  5. js自写字符串 append 方法

    function stringbuilder(){ this.arr = new Array(); this.append=function(str) { this.arr.push(str); } ...

  6. HDU 3038 How Many Answers Are Wrong (并查集)---并查集看不出来系列-1

    Problem Description TT and FF are ... friends. Uh... very very good friends -________-bFF is a bad b ...

  7. java.lang.IllegalArgumentException: Can't convert argument: null

    出现这样的异常:: 这是由于eclipse在修改项目名的时候,eclipse自动更新部署了web.xml文件 并且重新生成了xml文件的头部声明. 新增了java的命名把这个javaee去掉就可以了. ...

  8. Linux -- ls只显示目录

    ls没有直接显示目录的选项, 不过根据目录和文件显示的差异,可以搭配grep来实现 方法1: ll | grep "^d" 方法2: ls -F | grep$ "/$& ...

  9. 彻底搞明白find命令的-mtime参数的含义【转载】

    转自: 彻底搞明白find命令的-mtime参数的含义-goolen-ITPUB博客http://blog.itpub.net/23249684/viewspace-1156932/ 以前一直没有弄明 ...

  10. mysql建表: 主键,外键约束

    CREATE DATABASE db_studentinfo; USE db_studentinfo ; DROP TABLE IF EXISTS t_student ; CREATE TABLE t ...