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. 根据SVN的MESSAGE进行多版本输出,反向排序,真是曲折~~~啊

    import os,sys,time file = open('svnlog') revList = [] tempList = [] linen = 1 for line in file: if ( ...

  2. simulate windows postmessage or keydown

    2 ways: 1. under TForm:   if assigned(focused) then      Focused.keydown(key,keychar,[]); 2. using s ...

  3. Python 坑爹之 代码缩进

    建议:统一使用空格!!!!!!!!!不要Tab Python代码缩进   这两天python-cn邮件列表有一条thread发展的特别长,题目是<python的代码缩进真是坑爹>(地址), ...

  4. MySQL常用Json函数

    官方文档:JSON Functions Name Description JSON_APPEND() Append data to JSON document JSON_ARRAY() Create ...

  5. java开发经验分享(二)

    二. 数据库 1. SQL语句中保留字.函数名要大写,表明.字段名全部小写 如:SELECT vc_name,vc_sex,i_age FROM user WHERE i_id = 100 AND i ...

  6. Windows下编译eXosip、osip,以及UAC和UAS的例子

    今天开始了SIP开源库的学习,我选择了osip和eXosip,但是这两个库的编译使用有些麻烦,源码下来之后编译会出现很多问题,网上也没有找到完整的编译介绍,只能一步一步的找办法解决,最后终于编译成功! ...

  7. HashMap Collision Resolution

    Separate Chaining Use data structure (such as linked list) to store multiple items that hash to the ...

  8. 关于maven-jetty-plugin 自动重启问题

    <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin ...

  9. HTML5 拼图游戏

    点击之后被选中的切片会变为透明 源代码 点击打开链接

  10. java DI 框架spring(web)、Guice(web)、Dagger&Dagger2(android)

    java DI 框架spring(web).Guice(web).Dagger&Dagger2(android) (待续...)