2017.4.23 1.矩形分割

1.矩形分割

(二分)

1000ms

内存限制: 
65536kB
描述

平面上有一个大矩形,其左下角坐标(0,0),右上角坐标(R,R)。大矩形内部包含一些小矩形,小矩形都平行于坐标轴且互不重叠。所有矩形的顶点都是整点。要求画一根平行于y轴的直线x=k(k是整数) ,使得这些小矩形落在直线左边的面积必须大于等于落在右边的面积,且两边面积之差最小。并且,要使得大矩形在直线左边的的面积尽可能大。注意:若直线穿过一个小矩形,将会把它切成两个部分,分属左右两侧。

输入
第一行是整数R,表示大矩形的右上角坐标是(R,R) (1 <= R <= 1,000,000)。
接下来的一行是整数N,表示一共有N个小矩形(0 < N <= 10000)。
再接下来有N 行。每行有4个整数,L,T, W 和 H, 表示有一个小矩形的左上角坐标是(L,T),宽度是W,高度是H (0<=L,T <= R, 0 < W,H <= R). 小矩形不会有位于大矩形之外的部分。
输出
输出整数n,表示答案应该是直线 x=n。 如果必要的话,x=R也可以是答案。
样例输入
1000
2
1 1 2 1
5 1 2 1
样例输出
    5
思路:对区间[0,R]进行二分,假设区间中点所在直线x=mid为解,若x=mid时左边面积大于右边面积则right=mid,若x=mid时左边面积小于右边面积则left=mid。二分查找完的解要符合“使得大矩形在直线左边的的面积尽可能大”的条件,所以当不改变左右面积差的情况下,直线要尽可能在右边。

#include<cstdio>
long long x1[10001],x2[10001],y[10001],w[10001],h[100001],s[100001];
long long R,n,ans;
long long sum(long long mid)
{
long long sum=0;
for(long long i=1;i<=n;i++)
{
if(x2[i]<=mid)
sum+=s[i];
else if(x1[i]>=mid)
sum-=s[i];
else
sum+=h[i]*(mid-x1[i])-h[i]*(x2[i]-mid);
}
return sum;
}
void Find(long long l,long long r)
{
if(l==r)
{
ans=l;
return ;
}
long long mid;
mid=(l+r)/2;
if(sum(mid)>=0)
Find(l,mid);
else Find(mid+1,r);
}
int main()
{
scanf("%lld%lld",&R,&n);
for(long long i=1;i<=n;i++)
{
scanf("%lld%lld%lld%lld",&x1[i],&y[i],&w[i],&h[i]);
x2[i]=x1[i]+w[i];
s[i]=w[i]*h[i];
}
Find(0,R);
while(sum(ans)==sum(ans+1)&&ans<R) ans++;
printf("%lld\n",ans);
return 0;
}


时间: 2024-12-14 17:36:11

2017.4.23 1.矩形分割的相关文章

[Offer收割]编程练习赛12 题目3 : 矩形分割

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一块由NxM个单位正方形组成的矩形.现在小Ho在某些单位正方形上画了一道分割线,这条分割线或者是单位正方形的主对角线(用'\'表示),或者是副对角线(用'/'表示). 现在小Hi想知道这些分割线把NxM的矩形分割成了多少块区域. 例如 /\/ 就把2x2的矩形分成了5个区域. /\/\ / \/ 把3x4的矩形分成了7个区域. 输入 第一包含两个整数N和M.(1 <= N, M <= 100) 以下N行每行包

hnu12884 Area Coverage 矩形分割 or 线段树

题意:给你n个二维平面上的矩形,可以两两覆盖,问最后覆盖的总面积为多少 解题思路:1)矩形状分割,可以知道,每多出一个矩形就和前面所有产生的矩形判断,看是有相交,如果有的话,就对前面的矩形进行分割,最多可以分割成8块,因为这个算法是n×n的算法时间复杂度,所以我们还需要在枚举的时候加速,采用引导值(下一个不为0的矩阵的值),最后6700ms过了 解题代码: 1 // File Name: rect1.c 2 // Author: darkdream 3 // Created Time: 2014

多个限制的二分题 poj 矩形分割

openoj 矩形分割 总时间限制:  1000ms  内存限制: 65536kB 描述 平面上有一个大矩形,其左下角坐标(0,0),右上角坐标(R,R).大矩形内部包含一些小矩形,小矩形都平行于坐标轴且互不重叠.所有矩形的顶点都是整点.要求画一根平行于y轴的直线x=k(k是整数) ,使得这些小矩形落在直线左边的面积必须大于等于落在右边的面积,且两边面积之差最小.并且,要使得大矩形在直线左边的的面积尽可能大.注意:若直线穿过一个小矩形,将会把它切成两个部分,分属左右两侧. 输入 第一行是整数R,

hihoCoder 第253周 hiho一下 矩形分割

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一块由NxM个单位正方形组成的矩形.现在小Ho在某些单位正方形上画了一道分割线,这条分割线或者是单位正方形的主对角线(用'\'表示),或者是副对角线(用'/'表示). 现在小Hi想知道这些分割线把NxM的矩形分割成了多少块区域. 例如 /\/ 就把2x2的矩形分成了5个区域. /\/\ / \/ 把3x4的矩形分成了7个区域. 输入 第一包含两个整数N和M.(1 <= N, M <= 100) 以下N行每行包

【第三组】冲刺会议 2017.7.23

冲刺会议 日期:2017.7.23 开发小组:Geomestry 冲刺经理:程立智 成员: 程立智 李明伦 郑昊 蔡镇泽 温志成 汪涵 成员:程立智 完成工作:完成一键还原 所遇问题: 全屏设置有bug 下一步工作:完善选关界面 成员:李明伦 完成工作:重构改关卡类 所遇问题:不知道关卡具体信息所用数据结构 下一步工作:编写关卡参数类 成员:郑昊 完成工作:HomePage自适应 所遇问题:无法限制最小窗口 下一步工作:继续实现UI大小自适应 成员:蔡镇泽 完成工作: 圆功能的实现 所遇问题:

2017.10.23 大盘观后感

今天大盘好无聊,上上下下就几个点,持有的股票全天几乎没有涨,最近行情很无聊. 操作大专栏  2017.10.23 大盘观后感ng>:无 策略:继续保持低仓位的持股不动 持仓:继续战略持有中南和格力,保持定力,趁着股市清单看看书也挺好. 预计:预计到年底前都不会有上涨行情,反而下跌的概率比较大,预计能跌到3100点左右(不过现在属于国家队坐庄模式,已经不能用点数来决定个股的涨跌了) 原文地址:https://www.cnblogs.com/wangziqiang123/p/11696388.htm

矩形分割

题目链接:http://noi.openjudge.cn/ch0111/03/ 一个二分的题目,估计是数据类型选择不当,折腾了好多天.所以,以后记得尽管使用long  long类型数据呵呵 描述 平面上有一个大矩形,其左下角坐标(0,0),右上角坐标(R,R).大矩形内部包含一些小矩形,小矩形都平行于坐标轴且互不重叠.所有矩形的顶点都是整点.要求画一根平行于y轴的直线x=k(k是整数) ,使得这些小矩形落在直线左边的面积必须大于等于落在右边的面积,且两边面积之差最小.并且,要使得大矩形在直线左边

POJ 8208 矩形分割 【二分】

要使两边面积之差最小且保证小矩形直线左边面积大于等于右边面积,在此基础上使大矩形在直线左边的面积尽量大. 想了想后我把这道题分为两步解决,首先找到面积之差的最小值:然后想到一个范围内划直线都是这个最小值,在这个范围内找到最右边的(即保证大矩形左边的面积最大). 第一次二分算面积之差最小值,square(k)返回x=k这条直线左边小矩形的面积,s是所有小矩形的面积:若square(k)>=s-square(k),那面积差最小就在k的左边(包括k),不然就在k+1右边找. 第二次二分的本质是左右矩形

《三联生活周刊》2017年23期:5星。地球年龄与人类进化的检测技术的简史。

本期主题是人类测量地球年龄与人类进化史的技术的简史.地球年龄最终依靠同位素测量法确定为45.5亿年,人类进化史初期是根据化石推测,后来则根据DNA的变化来推算. 个人感觉这是看过的袁岳的文章中最精彩的一篇,有靠谱的技术发展史,故事也比较有意思.袁岳是理科生风格,严肃有余,讲故事的天赋则相对不足.当然反过来说讲故事天赋比较好的人,一般来说写出来的东西可靠性稍差. 以下是书中内容的摘抄,大部分是主题文章的摘抄.#号后面是kindle电子书中的页码: 1:再后来,他采用了一种从铀铅测年法推导出来的铅铅