这个问题很有趣的项目,写麻烦。它预计将有写了很长的时间。

好在,我想开了一个比较简单的方法。。

使用位计算,颜色RGB分别1,2,4,代表。

状态的长度了。

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<math.h>
#include<map>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define maxn 11000
#define mem(a,b) (memset(a),b,sizeof(a))
#define lmin 1
#define rmax len
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define root lmin,rmax,1
#define now l,r,rt
#define int_now int l,int r,int rt
#define INF 99999999
#define LL __int64
#define mod 10007
#define eps 1e-6
#define zero(x) (fabs(x)<eps?0:x)
map<int,int>mp;
int du[maxn*2];
int len;
struct list
{
int x;
int y,yy;
int cl;
int leap;
friend bool operator <(const list &a,const list &b)
{
return a.x<b.x;
}
}node[maxn*2];;
int color[maxn*4*4][8];
int yan[maxn*4*4][3];
void creat()
{
memset(color,0,sizeof(color));
memset(yan,0,sizeof(yan));
}
void push_up(int_now)
{
int tai=0;
for(int i=0;i<=2;i++)
if(yan[rt][i])tai=tai|(1<<i);
for(int i=0;i<=7;i++)color[rt][i]=0;
int all=du[r+1]-du[l];
for(int i=1;i<=7;i++)
{
color[rt][i|tai]+=color[rt<<1][i]+color[rt<<1|1][i];
}
for(int i=1;i<=7;i++)all-=color[rt][i];
color[rt][tai]+=all;
}
void updata(int ll,int rr,int cl,int x,int_now)
{
if(ll>r||rr<l)return;
if(ll<=l&&rr>=r)
{
yan[rt][cl]+=x;
push_up(now);
return;
}
updata(ll,rr,cl,x,lson);
updata(ll,rr,cl,x,rson);
push_up(now);
}
int main()
{
int T,cas;
scanf("%d",&T);
cas=0;
int n,x,y,xx,yy;
char str[1110];
while(T--)
{
cas++;
scanf("%d",&n);
int cl;
int ls=0;
du[0]=-1;
for(int i=1;i<=n;i++)
{
scanf("%s%d%d%d%d",str,&x,&y,&xx,&yy);
if(str[0]=='R')cl=0;
if(str[0]=='G')cl=1;
if(str[0]=='B')cl=2;
node[i*2-1].cl=cl; node[i*2-1].y=y ; node[i*2-1].leap=1;
node[i*2-1].x=x; node[i*2-1].yy=yy;
node[i*2 ].cl=cl; node[i*2 ].y=y ; node[i*2 ].leap=-1;
node[i*2 ].x=xx; node[i*2 ].yy=yy;
du[++ls]=y;
du[++ls]=yy;
}
sort(node+1,node+n*2+1);
sort(du,du+ls+1);
len=0;
for(int i=1;i<=ls;i++)
{
if(du[i]!=du[i-1])
{
mp[du[i]]=++len;
du[len]=du[i];
}
}
len--;
LL are[8];
int st;
st=0;
creat();
memset(are,0,sizeof(are));
for(int i=1;i<=n*2;i++)
{
int l=mp[node[i].y];
int r=mp[node[i].yy];
for(int j=1;j<=7;j++)
{
are[j]+=(LL)color[1][j]*(node[i].x-st);
}
st=node[i].x;
updata(l,r-1,node[i].cl,node[i].leap,root);
}
printf("Case %d:\n",cas);
printf("%I64d\n",are[1]);
printf("%I64d\n",are[2]);
printf("%I64d\n",are[4]);
printf("%I64d\n",are[3]);
printf("%I64d\n",are[5]);
printf("%I64d\n",are[6]);
printf("%I64d\n",are[7]);
}
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

hdu-4419-Colourful Rectangle-段树区,并寻求的更多相关文章

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

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

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

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

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

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

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

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

  5. hdu 4419 Colourful Rectangle

    http://acm.hdu.edu.cn/showproblem.php?pid=4419 题意:给出3种颜色,重叠会生成新的颜色,然后有一些矩形,求出每种颜色的面积. 转化为二进制表示颜色:001 ...

  6. HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)

    6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...

  7. hdu 1542 Atlantis 段树区,并寻求,,,尼玛真坑人数据,不要打开一小阵!

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. HDU ACM 4578 Transformation-&gt;段树-间隔的变化

    分析:复杂的经营分部树. 只有一个查询操作,这是要求[l,r]的数量之间p钍总和.并不是所有的查询所有节点,会议TLE.最好的是查询部件[a.b].所有这个区间值我们是平等的,即能返回(b-a+1)* ...

  9. hdu 4107当卡段树

    其核心思想是记录最大的节点值和最低值,假设max<p要么min>=p时间,在节点只变化add值,不要子树遍历:否则,就往子树递归. #include<iostream> #in ...

  10. HDU 1394 Minimum Inversion Number (数据结构-段树)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

随机推荐

  1. Facebook新框架React Native,一套搞定App开发[转]

    Facebook新框架React Native,一套搞定App开发 本文来自微信公众号“给产品经理讲技术”(pm_teacher),欢迎关注. 做为一名产品经理,你是否遇到过这样的窘境,“帮我把字体调 ...

  2. 无奈而又苦逼的二分版本号回退法定位新引入的bug!!!

    昨天測试人员和开发者都发现, 某新版本号有严重的bug.  群里已经開始嚷嚷了, 但没有谁知道是谁引入的问题.本来呢, 这个问题不应该是由我去定位, 但主管让我帮定位一下, 毕竟时间太紧急, 必须尽快 ...

  3. NET中小型企业项目开发框架系列(一个)

    当时的前端,我们开发了基于Net一组结构sprint.NET+NHibernate+MVC+WCF+EasyUI等中小型企业级系统开发平台,如今把整个开发过程中的步步进展整理出来和大家分享,这个系列可 ...

  4. Linux鸟哥的私房菜(3)— 总体规划和磁盘分区 读书笔记

    1.每个硬件设备Linux中的文件名称 在Linux系统中.每一个设备都被当成一个文件来对待.而且差点儿全部的硬件设备文件都在/dev文件夹下 常见设备与其对于文件名称 2.磁盘连接的方式与设备文件名 ...

  5. 【.NET进程通信】初探.NET中进程间通信的简单的实现

    转载请注明出处:http://blog.csdn.net/xiaoy_h/article/details/26090277 废话不多说,IPC就是进程间通信. 进程间通信能够採用的方法非常多,比方创建 ...

  6. 怎样用C#代码管理SharePoint解决方式

    怎样用C#代码管理SharePoint解决方式         本文我们将了解怎样用代码管理SharePoint解决方式.我们使用server端对象模型抽取解决方式.         SharePoi ...

  7. c# 用正则表达式在指定的字符串中每隔指定个数的文字插入指定字符串

    public static string AddNewLine(string inString,int num,string addString="\r\n") { return ...

  8. ios崩溃日志1

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not loa ...

  9. std::list.pop_back() 弹空了列表导致的崩溃

    core文件输出: (gdb) bt # # ) at xxxxx/sql/signal_handler.cc: # <signal handler called> # # # # # 0 ...

  10. MySQL列:innodb的源代码的分析的基础数据结构

    在过去的一年中的数据库相关的源代码分析.前段时间分析levelDB实施和BeansDB实现,数据库网络分析这两篇文章非常多.他们也比较深比较分析,所以没有必要重复很多劳力.MYSQL,当然主要还是数据 ...