51nod-1562 玻璃切割

题目来源:  CodeForces
基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20  难度:3级算法题
 收藏
 关注

现在有一块玻璃,是长方形的(w 毫米× h 毫米),现在要对他进行切割。

切割的方向有两种,横向和纵向。每一次切割之后就会有若干块玻璃被分成两块更小的玻璃。在切割之后玻璃不会被移动。

现在想知道每次切割之后面积最大的一块玻璃是多少。

样例解释:


对于第四次切割,下面四块玻璃的面积是一样大的。都是2。


Input
单组测试数据。
第一行有三个整数 w,h,n (2≤w,h≤200000, 1≤n≤200000),表示玻璃在横向上长w 毫米,纵向上长h 毫米,接下来有n次的切割。
接下来有n行输入,每一行描述一次切割。
输入的格式是H y 或 V x。
H y表示横向切割,切割线距离下边缘y毫米(1≤y≤h-1)。
V x表示纵向切割,切割线距离左边缘x毫米(1≤x≤w-1)。
输入保证不会有两次切割是一样的。
Output
对于每一次切割,输出所有玻璃中面积最大的是多少。
Input示例
样例输入1
4 3 4
H 2
V 2
V 3
V 1
Output示例
样例输出1
8
4
4
2

思路:对于求每次分割的最大区域面积,即求每次长和宽的最大长度。而要求最大值,则可以将所有切割线段按先后顺序保存下来,用mw,mh分别保存长宽的最大值,再从后面开始一个个将切割线段 ai 去掉,在去掉 ai 时,则将 ai所在的线段合并,再和最大值比较。因此需要预先将 每个切割线段的左右线段记录即可。

Code :

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;

struct node{
	int l;
	int r;
};
const int MAX_N=200005;
int n,w,h;
int a[MAX_N][2];
vector<int> wi,hi;	//所有切割线段 
node dw[MAX_N],dh[MAX_N];	//dw[i] 切割线段 i 的左右切割线段 
LL ans[MAX_N];

int main()
{
	ios::sync_with_stdio(false);
	cin>>w>>h>>n;
	char c;
	for(int i=0;i<n;++i)
	{
		cin>>c>>a[i][1];
		if(c=='V'){
			a[i][0]=1;
			wi.push_back(a[i][1]);
		}else	hi.push_back(a[i][1]);
	}
	sort(wi.begin(),wi.end());
	sort(hi.begin(),hi.end());
	int mw=0,mh=0;
	int l=0;
	int tt=wi.size()-1;
	for(int i=0;i<tt;++i)
	{
		mw=max(mw,wi[i]-l);
		dw[wi[i]]=node{l,wi[i+1]};
		l=wi[i];
	}
	if(wi.size()){
		mw=max(mw,wi[wi.size()-1]-l);
		mw=max(mw,w-wi[wi.size()-1]);
		dw[wi[wi.size()-1]]=node{l,w};
	}else	mw=w;
	l=0;
	tt=hi.size()-1;
	for(int i=0;i<tt;++i)
	{
		mh=max(mh,hi[i]-l);
		dh[hi[i]]=node{l,hi[i+1]};
		l=hi[i];
	}
	if(hi.size()){
		mh=max(mh,hi[hi.size()-1]-l);
		mh=max(mh,h-hi[hi.size()-1]);
		dh[hi[hi.size()-1]]=node{l,h};
	}else	mh=h;
	for(int i=n-1;i>=0;--i)
	{
		ans[i]=(LL)mw*mh;
		if(a[i][0]==1){
			node t=dw[a[i][1]];
			dw[t.l].r=t.r;
			dw[t.r].l=t.l;
			mw=max(mw,t.r-t.l);
		}else{
			node t=dh[a[i][1]];
			dh[t.l].r=t.r;
			dh[t.r].l=t.l;
			mh=max(mh,t.r-t.l);
		}
	}
	for(int i=0;i<n;++i)
		cout<<ans[i]<<endl;
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《极限切割》是当今国内市场首屈一指的套料计算软件。自2004年投放市场以来,不断改进创新,功能日趋完善,深受广大用户欢迎。这里简要介绍这款软件的主要特色,详细内容参见本网站其它相关介绍。 《极限切割》提供了许多可以选择的切割参数,涵盖了机械(金属平板、卷板、原板反算等)、家具、石材、玻璃、装修等行业常用的各类排料参数,是一款通用性非常好的排料软件。下图展示了部分切割参数,为提高操作效率,还有一部分切割参数分布在数据录入和计算环节。 《极限切割专业版》(矩形排料、型材排料) 专门针对矩形材料排料,支持一刀切,特别适合玻璃切割、门窗加工、板式家具开料、金属剪板机作业、石材切割等生产领域。 《极限切割数控版》(数控玻璃切割机专用) 针对数控玻璃切割设备,支持矩形、异型玻璃切割。目前已经在贝佳莱(奥地利)、济南德佳玻璃机器有限公司采用。 《极限切割工业版》(异型材料切割) 针对异型零件套料开发的优化计算软件,计算速度和材料利用率都达到国际先进水准。支持AutoCad,可用于各类等离子切割、激光切割、火焰切割设备。 《极限工厂》——中小企业ERP系统 针对中小企业的特点,提供包括进、销、存、生产管理、套料计算的一体化的管理系统。即可弹机运行,也可运行在网络环境。 套料,排料,裁板,型材下料,板材优化,玻璃切割,开料,算料,省料,切割玻璃切割排料优化,坯材开料下料优化,板材切割开料下料套料优化,板材数控切割优化,异型套料优化计算

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值