建模需要注意下细节,,这是做扫描线的惯例,就是最好把模型建立在笛卡尔坐标系上

剩下的看链接和注释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矩形面积并的更多相关文章

  1. [LeetCode] Rectangle Area 矩形面积

    Find the total area covered by two rectilinear rectangles in a2D plane. Each rectangle is defined by ...

  2. POJ 1151 Atlantis(线段树-扫描线,矩形面积并)

    题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...

  3. 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( ...

  4. 扫描线 + 线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage

    Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit user ...

  5. 【HDU 1542】Atlantis(线段树+离散化,矩形面积并)

    求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<c ...

  6. 2015baidu复赛 矩形面积(包凸 && ps:附quickhull模板)

    矩形面积 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. 2015年百度之星初赛(1) --- F 矩形面积

    矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少.   Input 第一行一个正整数 T, ...

  8. POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并

    题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...

  9. POJ 1151 Atlantis 线段树求矩形面积并 方法详解

    第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...

随机推荐

  1. eclipse中编辑properties文件无法看到中文

    如果在eclipse中编辑properties文件无法看到中文则参考“Eclipse开发环境配置-indigo.docx”添加propedit插件.

  2. 机器学习:Python实现聚类算法(二)之AP算法

    1.算法简介 AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法,是在2007年的Science杂志上提出的一种新的聚类算法.AP算法的基本思想是将全部数据点都 ...

  3. 微信公众号绑定服务器 Flask版

    python 代码 from flask import Flask, request from flask_cors import CORS app = Flask(__name__) app.app ...

  4. prompt更改MySQL登陆后的提示符

    临时生效 mysql> prompt \u@standby \r:\m:\s > PROMPT set to '\u@standby \r:\m:\s >' root@standby ...

  5. angularjs指令中scope参数 true、false、{} 的区别详解

    scope 有三个参数 true.false.{} scope 默认是 false,当 scope设置为true时,会从父作用域继承并创建一个新的作用域对象, 按照true .false的反向思维,我 ...

  6. luogu P2680 运输计划

    传送门 要最长链的长度最短,一秒想到二分,因为如果对于某个长度满足改掉一边的边权后能使得所有链长度不超过该长度,则所有比他长的长度也满足. 二分最终答案.我们要使得原来长度大于二分的\(mid\)的链 ...

  7. Window上,启动Tomcat服务之后,关闭启动窗口,服务器也随之关闭

    在Window环境上,启动Tomcat服务器之后,随手关闭启动窗口,服务器也随之关闭了. 现在想要的效果是,当关闭启动窗口后,服务器仍然运行. 1. 开始:运行cmd,进入doc命令行 tomcat安 ...

  8. Python实现图片压缩

    项目中大量用到图片加载,由于图片太大,加载速度很忙,因此需要对文件进行统一压缩 一:导入包 from PIL import Image import os 二:获取图片文件的大小 def get_si ...

  9. Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  10. Node、PHP、Java 和 Go 服务端 I/O 性能PK

    http://blog.csdn.net/listen2you/article/details/72935679