Adding New Machine

Problem Description
Incredible Crazily Progressing Company (ICPC) suffered a lot with the low speed of procedure. After investigation, they found that the bottleneck was at Absolutely Crowded Manufactory (ACM). In oder to accelerate the procedure, they bought a new machine for
ACM. But a new problem comes, how to place the new machine into ACM? 



ACM is a rectangular factor and can be divided into W * H cells. There are N retangular old machines in ACM and the new machine can not occupy any cell where there is old machines. The new machine needs M consecutive cells. Consecutive cells means some adjacent
cells in a line. You are asked to calculate the number of ways to choose the place for the new machine. 
 
Input
There are multiple test cases (no more than 50). The first line of each test case contains 4 integers W, H, N, M (1 ≤ W, H ≤ 107, 0 ≤ N ≤ 50000, 1 ≤ M ≤ 1000), indicating the width and the length of the room, the number of old machines and the size
of the new machine. Then N lines follow, each of which contains 4 integers Xi1, Yi1, Xi2 and Yi2 (1 ≤ Xi1 ≤ Xi2 ≤ W, 1 ≤ Yi1 ≤ Yi2 ≤ H), indicating the coordinates of the
i-th old machine. It is guarantees that no cell is occupied by two old machines. 
 
Output
Output the number of ways to choose the cells to place the new machine in one line. 
 
Sample Input
3 3 1 2
2 2 2 2
3 3 1 3
2 2 2 2
2 3 2 2
1 1 1 1
2 3 2 3
 
Sample Output
8
4
3
 
Author
GUAN, Yao
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  4056 4059 4053 4057 4051 
 

题目大意:

w*h的格子,如今有n个矩形上已经摆放了东西,如今你要放一个东西长度为m,问你有多少种方法?

解题思路:

枚举无用的情况,假设东西横着放

(1)假设碰到障碍物,也就是假设 某个东西占着Xi1,Yi1,Xi2,Yi2,那么max(xi1+1-m,0) , x2 y1y2这片矩形区域就不能放东西。

(2)还有就是被墙当着,也就是max(0,w+1-m),w,0,h这片矩形区域就不能放东西。

假设竖着放,也是差点儿相同的。

坑点:假设m==1,也就是横着和竖着是一样的情况,仅仅需考虑一种,我就是这被坑了,弹了20遍。

解题代码:

#include <iostream>
#include <vector>
#include <cmath>
#include <map>
#include <cstdio>
#include <algorithm>
using namespace std; typedef long long ll; const int maxn=51000;
struct node{
int l,r,pos,c;
node(int l0=0,int r0=0,int pos0=0,int c0=0){
l=l0,r=r0,pos=pos0;c=c0;
}
friend bool operator < (node a,node b){
return a.pos<b.pos;
}
}; struct rec{
int x1,y1,x2,y2;
}d[maxn]; vector <node> v;
int w,h,m,n;
vector <int> c;
map <int,int> mp; struct Tree{
int l,r,cover,len;
}tree[8*maxn]; void build(int l,int r,int k){
tree[k].l=l;
tree[k].r=r;
tree[k].len=0;
tree[k].cover=0;
if(l+1>=r) return;
int mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid,r,k<<1|1);
} void pushup(int k){
if(tree[k].cover>0) tree[k].len=c[tree[k].r]-c[tree[k].l];
else if(tree[k].l+1==tree[k].r) tree[k].len=0;
else tree[k].len=tree[k<<1].len+tree[k<<1|1].len;
} void insert(int l,int r,int k,int c0){
if(l<=tree[k].l && tree[k].r<=r){
tree[k].cover+=c0;
}
else{
int mid=(tree[k].l+tree[k].r)>>1;
if(r<=mid) insert(l,r,k<<1,c0);
else if(l>=mid) insert(l,r,k<<1|1,c0);
else{
insert(l,mid,k<<1,c0);
insert(mid,r,k<<1|1,c0);
}
}
pushup(k);
} ll getans(){
if(v.size()<=0) return (ll)w*(ll)h;
c.clear();
mp.clear();
sort(v.begin(),v.end());
for(int i=0;i<v.size();i++){
mp[v[i].l]=i;
mp[v[i].r]=i;
}
for(map <int,int>::iterator it=mp.begin();it!=mp.end();it++){
it->second=c.size();
c.push_back(it->first);
}
ll ret=0;
build(0,c.size()-1,1);
insert(mp[v[0].l],mp[v[0].r],1,v[0].c);
for(int i=1;i<v.size();i++){
ret+=(ll)(v[i].pos-v[i-1].pos)*(ll)tree[1].len;
insert(mp[v[i].l],mp[v[i].r],1,v[i].c);
}
return (ll)w*(ll)h-ret;
} void solve(){
v.clear();
for(int i=0;i<n;i++){
v.push_back(node(max(d[i].x1+1-m,0),d[i].x2,d[i].y1,1));
v.push_back(node(max(d[i].x1+1-m,0),d[i].x2,d[i].y2,-1));
}
if(m>1){
v.push_back(node(max(0,w+1-m),w,0,1));
v.push_back(node(max(0,w+1-m),w,h,-1));
} ll ans=getans(); if(m==1){
printf("%I64d\n",ans);
return;
} v.clear();
for(int i=0;i<n;i++){
v.push_back(node(max(d[i].y1+1-m,0),d[i].y2,d[i].x1,1));
v.push_back(node(max(d[i].y1+1-m,0),d[i].y2,d[i].x2,-1));
}
if(m>1){
v.push_back(node(max(0,h+1-m),h,0,1));
v.push_back(node(max(0,h+1-m),h,w,-1));
}
ans+=getans();
printf("%I64d\n",ans);
} int main(){
while(scanf("%d%d%d%d",&w,&h,&n,&m)!=EOF){
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&d[i].x1,&d[i].y1,&d[i].x2,&d[i].y2);
d[i].x1--;d[i].y1--;
}
solve();
}
return 0;
}

HDU 4052 Adding New Machine(矩形面积并)的更多相关文章

  1. HDU 4052 Adding New Machine (线段树+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4052 初始给你w*h的矩阵,给你n个矩形(互不相交),按这些矩形尺寸把初始的矩形扣掉,形成一个新的'矩 ...

  2. [HDU 4419] Colourful Rectangle (扫描线 矩形面积并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 题目大意:比矩形面积并多了颜色,问染成的每种颜色的面积. 矩形面积并的扫描线维护的是长度,这道题 ...

  3. hdu 1542 Atlantis(求矩形面积并)

    分别记录x坐标和y坐标,将其分别按照从左到有的方向排序.然后对于一个输入的矩形的x,y坐标范围内的下标进行标记.以两个相邻的坐标为最小单位分割图形,最后求总面积. #include<stdio. ...

  4. (HDU 1542) Atlantis 矩形面积并——扫描线

    n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...

  5. HDU Atlantis 线段树 表达区间 矩形面积相交

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 我的做法是把x轴的表示为线段,然后更新y 不考虑什么优化的话,开始的时候,把他们表达成线段,并按y排序,然 ...

  6. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

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

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

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

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

  9. hdu 1542 扫描线求矩形面积的并

    很久没做线段树了 求矩形面积的并分析:1.矩形比较多,坐标也很大,所以横坐标需要离散化(纵坐标不需要),熟悉离散化后这个步骤不难,所以这里不详细讲解了,不明白的还请百度2.重点:扫描线法:假想有一条扫 ...

随机推荐

  1. DOM手术台

    CSS分类 排队: <div id="box" style="width:200px;border:1px solid red color:red;font-siz ...

  2. 在Repeater控件中使用if语句

    原文:在Repeater控件中使用if语句 .Afr_ARTICLE_TITLE { font: NORMAL BOLD 14px "Tahoma"; } .Afr_CONTENT ...

  3. 简单QT应用了可实现手动布局QT应用

     新建QT项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/4 ...

  4. Android 获取屏幕大小和密度

    Android 获取屏幕大小和密度 DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay ...

  5. DOM attributes and properties

    element :attributes : DOM objects : properties 一个是元素属性的叙述性说明,它是对象属性的叙述性说明 版权声明:本文博客原创文章,博客,未经同意,不得转载 ...

  6. cocos2dx 使得单麻将(三)

    cocos2dx 使得单麻将(三) 麻将逻辑4.得到手牌数据 我们已经保存了一个一维数组, 类似于一个表格,统计出全部牌相应的数量, 但我们如何得到当前手中是什么牌呢 //扑克转换 BYTE Swit ...

  7. uva 11572 - Unique Snowflakes(和书略有不同)

    本书是关于使用刘汝佳set, 通过收集找到.count()和删除.erase().这种方法比我好.用较短的时间. 我想map这个任务可以完成.但是,这是不容易删除,必须先找到find()标.然后删除索 ...

  8. 推荐他们认为有用Sublime Text3小工具

    所有插件package control安装.一些国家的破解版sublime该插件是建立,安装自己的百度没有内置的方法,这里就不再重复 打开sublime.ctrl+shift+P,输入pis回车,稍等 ...

  9. UVa 10285 - Longest Run on a Snowboard

    称号:给你一个二维矩阵,找到一个点.每一个可以移动到的位置相邻的上下,求最长单调路径. 分析:贪婪,dp.搜索. 这个问题是一个小样本,我们该怎么办. 这里使用贪心算法: 首先.将全部点依照权值排序( ...

  10. Python installation

    PIP:Python & OS Support pip works with CPython versions 2.6, 2.7, 3.2, 3.3, 3.4 and also pypy. p ...