hdu4419
对于这类面积覆盖的题,大致就两点要注意的
1.同一把矩形放在笛卡尔坐标系上做
2.pushup函数要注意下细节:及在统计子区间和之前要先判断是否有子区间
用sum数组来保存区间被覆盖的情况,如果遇到多次覆盖问题,那就开多个sum数组分别保存被覆盖n次的情况
用cnt数组保存区间被完全覆盖的次数,如果是不同类型的矩形需要分别统计或者有特殊要求,那就开多个cnt数组分别保存
pushup如果cnt[rt]超过了k次,满足要求,那么就直接把sum[k]赋值为当前区间长度,然后其他sum数组归零,结束返回
否则如果cnt[rt]不为0,先把所有该区间的sum置零,然后把覆盖了该区间cnt[rt]次对应的sum赋值为当前区间长度如果rt没有子区间就返回,有子区间 i 就从1循环到k,如果cnt[rt]+i>=k,那么对应的sum[k]就是两个子区间的被覆盖i次的长度和,否则sum[i+cnt[rt]]就是两个子区间被覆盖i次的和。结束这次循环后sum[cnt[rt]]还要再减去本区间被覆盖大于cnt[rt]次对应的sum
最后如果cnt[rt]=0,i从1到k循环,如果没有子区间,sum就是0,有的话就是子区间的和
/*
颜色覆盖,多了颜色融合,,
用七个sum去记录七种颜色,三个cnt记录三种不同颜色的覆盖
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
#define maxn 20005
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
#define ll long long
struct Seg{
int x,y1,y2,c;
Seg(){}
Seg(int a,int b,int c,int d):x(a),y1(b),y2(c),c(d){}
bool operator<(const Seg & a)const
{return x<a.x;}
}segs[maxn];
int y[maxn],toty,tot;
int sum[maxn<<][],cnt[maxn<<][];
map<int,int>mp;
void pushup(int rt,int l,int r){
int tmp=;
if(cnt[rt][]) tmp|=;
if(cnt[rt][]) tmp|=;
if(cnt[rt][]) tmp|=;
//cout << tmp << endl;
for(int i=;i<=;i++)
sum[rt][i]=;
if(tmp){
sum[rt][tmp]=y[r]-y[l];
for(int i=;i<=;i++)
if(l+!=r && tmp!=(tmp|i)){ //如果有更高级的颜色
sum[rt][tmp|i]+=sum[rt<<][i]+sum[rt<<|][i];
sum[rt][tmp]-=sum[rt<<][i]+sum[rt<<|][i];
}
}
else if(l+!=r)
for(int i=;i<=;i++) sum[rt][i]=sum[rt<<][i]+sum[rt<<|][i];
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l && R>=r){
//cout<<c<<endl;
if(c>) cnt[rt][c]+=;
else cnt[rt][-c]-=;
pushup(rt,l,r);
return;
}
int m=l+r>>;
if(L<m) update(L,R,c,lson);
if(R>m) update(L,R,c,rson);
pushup(rt,l,r);
}
void init(){
tot=toty=;
mp.clear();
memset(sum,,sizeof sum);
memset(cnt,,sizeof cnt);
}
int main(){
int T,x1,x2,y1,y2,c,n;
char col[];
cin >> T;
for(int tt=;tt<=T;tt++){
init();
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%s%d%d%d%d",col,&x1,&y1,&x2,&y2);
if(col[]=='R') c=;
if(col[]=='G') c=;
if(col[]=='B') c=;
segs[tot++]=Seg(x1,y1,y2,c);
segs[tot++]=Seg(x2,y1,y2,-c);
y[toty++]=y1,y[toty++]=y2;
}
sort(y,y+toty);
toty=unique(y,y+toty)-y;
for(int i=;i<toty;i++) mp[y[i]]=i;
sort(segs,segs+tot); ll res[]={};
for(int i=;i<tot;i++){
if(i!=){
for(int j=;j<=;j++)
res[j]+=(ll)(segs[i].x-segs[i-].x)*sum[][j]; }
int y1=mp[segs[i].y1];
int y2=mp[segs[i].y2];
update(y1,y2,segs[i].c,,toty-,); } printf("Case %d:\n",tt);
printf("%lld\n",res[]);
printf("%lld\n",res[]);
printf("%lld\n",res[]);
printf("%lld\n",res[]);
printf("%lld\n",res[]);
printf("%lld\n",res[]);
printf("%lld\n",res[]); }
return ;
}
hdu4419的更多相关文章
- hdu4419 Colourful Rectangle 12年杭州网络赛 扫描线+线段树
题意:给定n个矩形,每个矩形有一种颜色,RGB中的一种.相交的部分可能为RG,RB,GB,RGB,问这n个矩形覆盖的面积中,7种颜色的面积分别为多少 思路:把x轴离散化做扫描线,线段树维护一个扫描区间 ...
- 【HDU4419 Colourful Rectangle】 线段树面积并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 题目大意:给你n个矩形,每个矩形都有一种颜色,矩形覆盖会出现另外一种颜色,问你所有矩形中不同的颜 ...
- HDU-4419 Colourful Rectangle 矩形多面积并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 利用二进制,R为1.G为2.B为4,然后通过异或运算可以得到其它组合颜色.建立7颗线段树,每颗线 ...
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
随机推荐
- 牛客多校第三场 A- PACM Team 背包/记忆路径
https://www.nowcoder.com/acm/contest/141#question 一眼背包,用四维dp记录在A,B,C,D条件限制下可以获得的最大知识点,但是题目要求输出路径,在输入 ...
- Python字符编码以及循环机制介绍
Python字符编码以及循环机制介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为一名运维人员就得不断的学习,那么如何身为运维的你是否已经嗅探已经很火的Python编程啦?大 ...
- tcpdump常用参数详解
tcpdump常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 好久没有更新我的博客了,看来自己最近还没有在放假中回过神来啊,哈哈~是不是也有小伙伴跟我一样呢?回归正题, ...
- 8、JPA-映射-双向一对一
一个管理对应一个部门,一个部门对应一个管理,例中由部门维护关联关系 实体类 Department package com.jpa.yingshe; import javax.persistence.* ...
- 《超哥带你学Linux》
前言 “Linux?听说是一个操作系统,好用吗?” “我也不知道呀,和windows有什么区别?我能在Linux上玩LOL吗” “别提了,我用过Linux,就是黑乎乎一个屏幕,鼠标也不能用,不停地的敲 ...
- IDEA中设置Tab多行显示、打开过多自动关闭的方法
IDEA中默认Tab是单行显示的,而且默认允许同时打开10个Tab,继续打开Tab会根据规则关闭之前打开的Tab.但是可以通过设置来符合自己的使用习惯. 一.打开Tab过多自动关闭 1.选择File→ ...
- CodeBlock 快捷键大全
一款开源的C/C++ IDE(集成开发环境),基于wxWidgets GUI体系,跨平台支持. 编辑器 快捷键 功能 Ctrl+Z 恢复上一次操作 Ctrl+Shift+Z 重复上一次操作 F1 ...
- Java Web之路(五)JSP
一.jsp的3个指令 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: p ...
- linux4.10.8 内核移植(四)---字符设备驱动_led驱动程序
一.字符设备驱动程序介绍 app里面用 open.read.write等等函数出来操作底层硬件.驱动程序中也有对应的xxx_open等函数.怎么找到驱动程序中的函数依赖于驱动程序框架. 二.搭建驱动程 ...
- leetcode --binary tree
1. 求深度: recursive 遍历左右子树,递归跳出时每次加一. int maxDepth(node * root) { if(roor==NULL) return 0; int leftdep ...