hdu4052矩形面积并
建模需要注意下细节,,这是做扫描线的惯例,就是最好把模型建立在笛卡尔坐标系上
剩下的看链接和注释https://blog.csdn.net/shiqi_614/article/details/7983508
/*
扫描线解一个被覆盖了一些面积的区间
问能空余地方能放置多少个1*M或M*1的矩形
设[i,j]为可以作为矩形放置起点的方块,那么只要统计出不能作为起点的方块的面积即可
本题用的是点的行列号,转换成笛卡尔坐标系上的坐标即可
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#define ll long long
#define maxn 100005
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
using namespace std;
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){return x<a.x;}
}segs[maxn];
map<int,int>mp;
int y[maxn],data[maxn][],tot,toty;
int sum[maxn<<],flag[maxn<<]; void pushup(int rt,int l,int r){
if(flag[rt]>)
sum[rt]=y[r]-y[l];
else {
if(l+==r) sum[rt]=;
else sum[rt]=sum[rt<<]+sum[rt<<|];
}
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l && R>=r){
flag[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);
}
ll solve(int n,int w,int h,int m){
memset(y,,sizeof y);
memset(segs,,sizeof segs);
memset(sum,,sizeof sum);
memset(flag,,sizeof flag);
mp.clear();
tot=toty=; y[toty++]=,y[toty++]=h;
segs[tot++]=Seg(max(,w-m),,h,);
segs[tot++]=Seg(w,,h,-);
for(int i=;i<n;i++){
int x1=max(,data[i][]-m),y1=data[i][];
int x2=data[i][],y2=data[i][];
segs[tot++]=Seg(x1,y1,y2,);
segs[tot++]=Seg(x2,y1,y2,-);
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!=) res+=(ll)(segs[i].x-segs[i-].x)*sum[];
update(mp[segs[i].y1],mp[segs[i].y2],segs[i].c,,toty-,);
// cout << res<<endl;
}
// cout << res << endl <<endl;
return res;
}
int main(){
int w,h,n,m;
while(scanf("%d%d%d%d",&w,&h,&n,&m)==){
for(int i=;i<n;i++)
for(int j=;j<;j++){
scanf("%d",&data[i][j]);
if(j==||j==)data[i][j]++;
}
ll res1=(ll)(w*h)-solve(n,w+,h+,m-);//把点行列号转换成笛卡尔坐标,即把点扩展成一块单位面积
for(int i=;i<n;i++){//对换矩形的xy轴坐标
swap(data[i][],data[i][]);
swap(data[i][],data[i][]);
}
ll res2=(ll)(w*h)-solve(n,h+,w+,m-);
//cout << res1 << " " << res2 << endl;
if(m!=) printf("%lld\n",res1+res2);
else printf("%lld\n",res1);//注意这个细节
}
return ;
}
hdu4052矩形面积并的更多相关文章
- [LeetCode] Rectangle Area 矩形面积
Find the total area covered by two rectilinear rectangles in a2D plane. Each rectangle is defined by ...
- POJ 1151 Atlantis(线段树-扫描线,矩形面积并)
题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...
- 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有
package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...
- 扫描线 + 线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage
Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit user ...
- 【HDU 1542】Atlantis(线段树+离散化,矩形面积并)
求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<c ...
- 2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)
矩形面积 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 2015年百度之星初赛(1) --- F 矩形面积
矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少. Input 第一行一个正整数 T, ...
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...
- POJ 1151 Atlantis 线段树求矩形面积并 方法详解
第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...
随机推荐
- scrapy xpath、正则表达式、css选择器
scrapy xpath XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力. 学习 ...
- 在tomcat集群环境下redis实现分布式锁
上篇介绍了redis在集群环境下如何解决session共享的问题.今天来讲一下如何解决分布式锁的问题 什么是分布式锁? 分布式锁就是在多个服务器中,都来争夺某一资源.这时候我们肯定需要一把锁是不是 , ...
- spring tool suite处理 maven项目名称红色感叹号的问题
今天构建一个springboot项目时,发现项目有个红色感叹号,但是pom.xml跟Build Path 都没问题. 解决方案: 选择 Windows --> show view --> ...
- JVM锁简介:偏向锁、轻量级锁和重量级锁
转自:https://www.aimoon.site/blog/2018/05/21/biased-locking/ 比较复杂,简略见另一篇:https://www.cnblogs.com/twohe ...
- 【1】AQS详解
概述: 它内部实现主要是状态变量state和一个FIFO队列来完成,同步队列的头结点是当前获取到同步状态的结点,获取同步状态state失败的线程,会被构造成一个结点加入到同步队列尾部(采用自旋CAS来 ...
- HashMap分析及散列的冲突处理
1,Hashing过程 像二分查找.AVL树查找,这些查找算法的时间复杂度为O(logn),而对于哈希表而言,我们一般说它的查找时间复杂度为O(1).那它是怎么实现的呢?这就是一个Hashing过程. ...
- android get或post及HttpClient与服务器数据交互
1.Service package mydemo.mycom.demo2.service; import org.apache.http.HttpResponse; import org.apache ...
- Linux之Ubuntu无线网络配置
无线网络使用问题: 0.插上有线网络电线与电脑NIC上. 1.set->系统设置->软件和更新->Ubuntu软件->下载自: 选择一个网络服务器地址(软件源)[http: ...
- postman变量的使用和设置
之前只是使用postman做接口管理——将各个项目使用到的接口分类管理起来,用的时候手动改参数调用.这次项目连着跑三个接口,需要用到前一个接口的参数,还来回切平台,真的很麻烦,所以就搜了一下有什么便利 ...
- openssl版本升级操作记录【转】
需要部署nginx的https环境,之前是yum安装的openssl,版本比较低,如下: [root@nginx ~]# yum install -y pcre pcre-devel openss ...