http://acm.hdu.edu.cn/showproblem.php?pid=4419

题意:给出3种颜色,重叠会生成新的颜色,然后有一些矩形,求出每种颜色的面积。

转化为二进制表示颜色:001 R ,010G,100B,011RG,101RB,....111RGB;

在结构体里面加上一个len[8]和cover[8]表示每种颜色所占的长度和在区间的覆盖次数。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100010
#define ll __int64
using namespace std; int t,n;
char ch;
ll Y[maxn];
struct node1
{
ll x,y1,y2;
int lr,c;
bool operator <(const node1 &a)const
{
return (x<a.x)||(x==a.x&&lr>a.lr);
}
}p[maxn];
struct node
{
int l,r;
ll len[];
int cover[];
} tree[maxn*]; void build(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
for(int j=; j<; j++)
{
tree[i].cover[j]=tree[i].len[j]=;
}
if(l==r-) return;
int mid=(l+r)>>;
build(i<<,l,mid);
build(i<<|,mid,r);
} void update(int i,int l,int r,int lr,int c)
{
if(tree[i].l==l&&tree[i].r==r)
{
tree[i].cover[c]+=lr;
if(tree[i].cover[c])
tree[i].len[c]=Y[tree[i].r]-Y[tree[i].l];
else if(tree[i].r-==tree[i].l)
tree[i].len[c]=;
else
tree[i].len[c]=tree[i<<].len[c]+tree[i<<|].len[c];
return ;
}
int mid=(tree[i].r+tree[i].l)>>;
if(r<=mid)
{
update(i<<,l,r,lr,c);
}
else if(l>=mid)
{
update(i<<|,l,r,lr,c);
}
else
{
update(i<<,l,mid,lr,c);
update(i<<|,mid,r,lr,c);
}
if(tree[i].cover[c])
tree[i].len[c]=Y[tree[i].r]-Y[tree[i].l];
else if(tree[i].r-==tree[i].l)
tree[i].len[c]=;
else
tree[i].len[c]=tree[i<<].len[c]+tree[i<<|].len[c];
} int main()
{
scanf("%d",&t);
int cas=;
while(t--)
{
scanf("%d",&n);
getchar();
int t1=;
for(int i=; i<=n; i++)
{
ll x1,y1,x2,y2;
scanf("%c %I64d%I64d%I64d%I64d",&ch,&x1,&y1,&x2,&y2);
if(ch=='R')
{
p[t1].c=; p[t1+].c=;
}
else if(ch=='G')
{
p[t1].c=; p[t1+].c=;
}
else if(ch=='B')
{
p[t1].c=; p[t1+].c=;
}
p[t1].x=x1; p[t1].y1=y1; p[t1].y2=y2;p[t1].lr=;Y[t1++]=y1;
p[t1].x=x2; p[t1].y1=y1; p[t1].y2=y2;p[t1].lr=-;Y[t1++]=y2;
getchar();
}
sort(Y,Y+t1);
int cnt=unique(Y,Y+t1)-Y;
sort(p,p+t1);
build(,,cnt-);
ll s[maxn]={};
for(int i=; i<t1; i++)
{
int l1=lower_bound(Y,Y+cnt,p[i].y1)-Y;
int rr=lower_bound(Y,Y+cnt,p[i].y2)-Y;
for(int j=; j<; j++)
{
if(p[i].c&j) update(,l1,rr,p[i].lr,j);
if(i+<t1) s[j]+=tree[].len[j]*(p[i+].x-p[i].x);
}
}
printf("Case %d:\n",cas);
cas++;
printf("%I64d\n",s[]-s[]);
printf("%I64d\n",s[]-s[]);
printf("%I64d\n",s[]-s[]);
printf("%I64d\n",s[]+s[]-s[]-s[]);
printf("%I64d\n",s[]+s[]-s[]-s[]);
printf("%I64d\n",s[]+s[]-s[]-s[]);
printf("%I64d\n",s[]+s[]+s[]-s[]-s[]-s[]+s[]);
}
return ;
}

hdu 4419 Colourful Rectangle的更多相关文章

  1. [HDU 4419] Colourful Rectangle (扫描线 矩形面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 题目大意:比矩形面积并多了颜色,问染成的每种颜色的面积. 矩形面积并的扫描线维护的是长度,这道题 ...

  2. hdu 4419 Colourful Rectangle (离散化扫描线线段树)

    Problem - 4419 题意不难,红绿蓝三种颜色覆盖在平面上,不同颜色的区域相交会产生新的颜色,求每一种颜色的面积大小. 比较明显,这题要从矩形面积并的方向出发.如果做过矩形面积并的题,用线段树 ...

  3. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  4. HDU 4419 Colourful Rectangle(线段树+扫描线)

    题目链接 主要是pushup的代码,其他和区间更新+扫描线差不多. 那个区间如果要再刷一层x,那么sum[x][rt] = que[r+1] - que[l];但是如果原本有颜色为i,颜色将会变成i| ...

  5. 【HDU4419 Colourful Rectangle】 线段树面积并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 题目大意:给你n个矩形,每个矩形都有一种颜色,矩形覆盖会出现另外一种颜色,问你所有矩形中不同的颜 ...

  6. HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)

    E - Largest Rectangle in a Histogram Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  7. HDU 1506 Largest Rectangle in a Histogram set+二分

    Largest Rectangle in a Histogram Problem Description: A histogram is a polygon composed of a sequenc ...

  8. HDU-4419 Colourful Rectangle 矩形多面积并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 利用二进制,R为1.G为2.B为4,然后通过异或运算可以得到其它组合颜色.建立7颗线段树,每颗线 ...

  9. hdu 1506 Largest Rectangle in a Histogram 构造

    题目链接:HDU - 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

随机推荐

  1. BZOJ 1492 货币兑换Cash

    http://www.lydsy.com/JudgeOnline/problem.php?id=1492 思路: 问题转变为维护一个凸包,每次转移都找凸包上的点,并更新凸壳 可以用splay维护,或者 ...

  2. Linux & Python 导航目录

    < Python学习手册(第4版)>< Python Cookbook(第2版)>中文版.pdf< Python 高级编程>< Python 基础教程 第二版 ...

  3. 通过代理访问nginx和直接访问nginx区别

    80.82.78.38 [23/Sep/2016:05:36:18 +0800] "GET http://www.baidu.com/cache/global/img/gs.gif HTTP ...

  4. 一位搬家师傅的O2O之旅

    一位搬家师傅的O2O之旅 By 诸神之黄昏 | 2014/08/14 [核心提示] 一位普通的搬家师傅,无意中被卷入如火如荼的 O2O 浪潮,起初,互联网让他尝到了甜头,后来则是更多的困惑和不解. 再 ...

  5. Delphi动态调用Java的WebService 转

    Delphi动态调用Java的WebService —— 基于“Axis2发布WebService例子(HelloWorld)” uses ComObj; var WsObject: Variant; ...

  6. c#秒转时分秒

          2个办法 @{             int hour = item.track / 3600;             int min = (item.track - hour * 3 ...

  7. JVM运行时内存结构

    原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...

  8. C# 图结构操作

    仿造<<Java常用算法手册>>里面对的算法,使用C#实现了一遍. 理论知识我就不讲解了,在这本书里面已经写的非常完美! 代码如何下: using System; using ...

  9. python ctypes小例子

    import time import ctypes import ctypes.wintypes SEE_MASK_NOCLOSEPROCESS = 0x00000040 SEE_MASK_INVOK ...

  10. [转]用Node.js创建自签名的HTTPS服务器

    用Node.js创建自签名的HTTPS服务器 创建自己的CA机构 创建服务器端证书 创建客户端证书 将证书打包 创建自己的CA机构 为CA生成私钥 openssl genrsa -out ca-key ...