UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
题意:
求矩形覆盖K次以上的面积
分析:
k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次
// File Name: 11983.cpp
// Author: Zlbing
// Created Time: 2013/7/21 16:06:54 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
using namespace std;
#define CL(x,v); memset(x,v,sizeof(x));
#define INF 0x3f3f3f3f
#define LL long long
#define REP(i,r,n) for(int i=r;i<=n;i++)
#define RREP(i,n,r) for(int i=n;i>=r;i--) #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 const int MAXN=6e4+;
struct seg{
int x1,x2,y;
int flag;
bool operator <(const seg& rsh)const{
return y<rsh.y;
}
}G[MAXN];
int hash[MAXN]; int col[MAXN<<];
int sum[MAXN<<][]; int n,m;
void build(int l,int r,int rt)
{
col[rt]=;
sum[rt][]=hash[r+]-hash[l];
for(int i=;i<=m;i++)sum[rt][i]=;
if(l==r)return;
int m=(l+r)>>;
build(lson);
build(rson);
}
void pushup(int rt,int l,int r)
{
if(col[rt]>=m)
{
memset(sum[rt],,sizeof(sum[rt]));
sum[rt][m]=hash[r+]-hash[l];
}
else if(l==r)
{
memset(sum[rt],,sizeof(sum[rt]));
sum[rt][col[rt]]=hash[r+]-hash[l];
}
else{
for(int i=;i<col[rt];i++)sum[rt][i]=;
for(int i=col[rt];i<m;i++)
{
sum[rt][i]=sum[rt<<][i-col[rt]]+sum[rt<<|][i-col[rt]];
}
sum[rt][m]=;
for(int i=m-col[rt];i<=m;i++)
{
sum[rt][m]+=sum[rt<<][i]+sum[rt<<|][i];
}
}
}
void update(int L,int R,int flag,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
col[rt]+=flag;
pushup(rt,l,r);
return;
}
int m=(l+r)>>;
if(L<=m)update(L,R,flag,lson);
if(R>m)update(L,R,flag,rson);
pushup(rt,l,r);
}
int main()
{
int T;
scanf("%d",&T);
int cas=;
while(T--)
{
scanf("%d%d",&n,&m);
int a,b,c,d;
int xlen=;
for(int i=;i<n;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
c++,d++;
G[xlen]=(seg){a,c,b,};
//G[xlen].x1=a,G[xlen].x2=c,G[xlen].y=b,G[xlen].flag=1;
hash[xlen]=a;
xlen++;
G[xlen]=(seg){a,c,d,-};
//G[xlen].x1=a,G[xlen].x2=c,G[xlen].y=d,G[xlen].flag=-1;
hash[xlen]=c;
xlen++;
}
sort(G,G+xlen);
sort(hash,hash+xlen);
int len=unique(hash,hash+xlen)-hash;
LL ans=;
build(,xlen-,);
for(int i=;i<xlen-;i++)
{
int x1=lower_bound(hash,hash+len,G[i].x1)-hash;
int x2=lower_bound(hash,hash+len,G[i].x2)-hash-;
update(x1,x2,G[i].flag,,xlen-,);
//printf("sum[1][m]=%I64d h=%d\n",sum[1][m],G[i+1].y-G[i].y);
ans+=(LL)sum[][m]*(LL)(G[i+].y-G[i].y);
}
printf("Case %d: %lld\n",cas++,ans);
}
return ;
}
UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]的更多相关文章
- UVA 11983 Weird Advertisement --线段树求矩形问题
题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
E - 秋实大哥与家 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...
- HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...
- poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)
题目链接 Description A number of rectangular posters, photographs and other pictures of the same shape a ...
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1542(线段树+扫描线 求矩形相交面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- Java基础知识强化之集合框架笔记17:List集合的特有的遍历功能
1. List集合的特有遍历功能: size()和 get()方法结合使用 2. 代码示例: package cn.itcast_03; import java.util.ArrayList; imp ...
- 零基础学习云计算及大数据DBA集群架构师【Linux系统环境及权限管理12.21-12.25】
从这周开始Linux的学习,老师是一位女老师,这到给了更多的信心,老师讲得很快,如果说只谈记命令的话是不多,但是要真正去理解,其实内容还是挺多的,我都是以老师讲的内容为主线,然后自己再看鸟哥的书做加深 ...
- JS实现一键复制功能
var copyClick = function (d) { var Url2 = $(d).parent().parent().find("#copy_value"); Url2 ...
- 利用DIV,实现简单的网页布局
<html lang="en"><head> <meta charset="UTF-8"> <title>GIS ...
- 各种语言HMAC SHA256实现
语言包含: Javascript ,PHP,Java,Groovy,C#,Objective C,Go,Ruby,Python,Perl,Dart,Swift,Rust,Powershell. Jav ...
- U3D 实现地面碰撞效果
前面讲了如何让两个刚体碰撞: 现在来细细讲解一下, 首先,精灵刚体后就好比物理世界的物体,是受到重力所用的, 然后两个物体要添加碰撞系数才能实现碰撞, 这种情况下,碰撞后会使得另一个刚体也会随之运动, ...
- java 字符串转int
//字符转整形 String aa = "23"; //int bb = Integer.parseInt(aa);//两种方式都是可以的 int bb = new Integer ...
- java中json转xml
参考:http://heipark.iteye.com/blog/1394844 需要json-lib-2.1-jdk15.jar和xom-1.2.5.jar,maven pom.xml如下: xml ...
- Chess---->简单命令框象棋(人VS人)
简单粗暴,直接先上代码: ChessBoard.h: 1 #ifndef CHESBOARD_H 2 #include<iostream> 3 #include<string& ...