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. C++11 in Qt5

    本文转载自:http://woboq.com/blog/cpp11-in-qt5.html   C++11 in Qt5 Posted by Olivier Goffart on 11 June 20 ...

  2. leetcode_question_119 Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...

  3. BZOJ2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 391  Solved: 127[Submi ...

  4. 减少leftJoin的使用 (转)

    作为开发,你是否经常碰到下面需要转换用户ID成用户名称的情况: 可惜你的这些业务表出于最少冗余设计要求,只有UserId,而没有UserName,这时你不得不破坏你一个类封装一个表的美好想法, 在你的 ...

  5. glibc的了解,对内核的封装

    glibc除了提供最底层的C运行库,还封装了kernel提供的API,程序通过glibc进行系统调用( syscall). 应用层面的C库,比如OpenSSL库: /usr/include/opens ...

  6. Paint House II 解答

    Question There are a row of n houses, each house can be painted with one of the k colors. The cost o ...

  7. java 面试基础典型题及答案

    1.switch能否作用在byte.int.long.String? 答案:switch能作用在byte.int.enum常量, 补充:jdk7可以作用在String上 2.short s = 1; ...

  8. Odometer使用JavaScript和CSS制作数字滑动效果

    Odometer是一个使用JavaScript和CSS技术,制作出数字上下滑动的动画效果插件,有点类似与我们的天然气的读数的动画效果,这个插件是轻量级的,压缩版本只有3kg,使用CSS3动画技术,所以 ...

  9. [置顶] STM32移植contiki进阶之三(中):timer 中文版

    鉴于自己英语水平不高,在这里,将上一篇关于contiki 的timer的文章翻译为中文,让自己在学习的时候,更方便点.文中有许多不是很通顺的地方,将就吧. Timers Contiki系统提供了一套时 ...

  10. java后台訪问url连接——HttpClients

    java后台訪问url,并传递数据--通过httpclient方式 须要的包,包可能多几个额外的,假设无用或者冲突删除就可以.httpclient是使用的是4.4.1的版本号:http://downl ...