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 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...
随机推荐
- 【Maven】基础概念、仓库、构建与部属
1.常见的自动化构建工具有: make.ant.maven.gradle,gradle是目前最新的,maven是目前最常用的. Eclipse是一种半自动化构建工具,主要体现在把:java文件-> ...
- python高级数据可视化视频Dash1
在谷歌浏览器输入http://127.0.0.1:8050/后,回车,看到下图可视化结果 # -*- coding: utf-8 -*- """ Created on S ...
- 学习Git笔记
一.名词解释 1.仓库(Repository) 仓库用来存放项目代码,每个项目对应一个仓库,多个开源项目则有多个仓库. 2.收藏(Star) 收藏项目,方便下次查看 3.复制克隆项目(Fork) 该f ...
- python---redis的python使用
set以及相关: r.set("foo","bar") print(r.get("foo"))#b'bar' #在Redis中设置值,默认, ...
- JAVA实现具有迭代器的线性表(单链表)
一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...
- C# Winform中慎用Application.DoEvents
private void Add() { ; i < ; i++) { Button button = new Button(); button.Width = ; button.Height ...
- position属性absolute与relative 的区别
连接:https://www.cnblogs.com/duyanli/p/3534005.html 每次要用到Position属性时,总要去搜索下,这两个属性值的区别:今天就直接复制网上的结果,以便以 ...
- composer设计原理与基本用法
原文地址:http://blog.turn.tw/?p=1039 COMPOSER進階原理:PHP命名空間與PSR-0 http://blog.turn.tw/?p=1122 Moving PHP ...
- jquery中选择checkbox拼接成字符串,然后到后台拆分取值
jquery中选择checkbox拼接成字符串,然后到后台拆分取值 js中的代码 $("#btn").click(function(){ var chenked=$("i ...
- Shell高级编程学习笔记(基础篇)
目录 1.shell脚本的执行方法 2.shell的变量类型 3.shell特殊变量 4.变量子串的常用操作 5.批量修改文件名实践 6.变量替换 7.在shell中计算字符串长度的方法 ...