Codeforces-527C--STL

题目意思:给你一块玻璃块,然后切k刀,要么横切,要么竖切,对于每一刀一个询问切完这刀后,最大的那块玻璃块面积是多少?

参考其他大佬的STL大法,用set去维护切隔的边界,multiset维护已有的面积,注意切一刀时,往左右找最近的边界,然后把这长或者宽从multiset里面删去;

#include <cstdio>
#include <iostream>
#include <set>
using namespace std;
set<int> sH,sW;//维护边界信息 
multiset<int> mH,mW;//维护的长和宽信息 
int main(){
	int w,h,q;scanf("%d%d%d",&w,&h,&q);
	sH.insert(0);sH.insert(h);
	sW.insert(0);sW.insert(w);
	mH.insert(h);mW.insert(w);
	char op;int pos;//操作类型与切的边界
	while(q--){
		scanf(" %c%d",&op,&pos);
		if(op == 'H'){
			sH.insert(pos);
			//找与切线相邻边界消去该长或宽 
			int a = *(--sH.find(pos));
			int b = *(++sH.find(pos));
			mH.erase(mH.find(b-a));
			mH.insert(b-pos);
			mH.insert(pos-a);
		}else{
			sW.insert(pos);
			int a = *(--sW.find(pos));
			int b = *(++sW.find(pos));
			mW.erase(mW.find(b-a));
			mW.insert(b-pos);
			mW.insert(pos-a);
		}
		printf("%lld\n",1ll**(--mW.end())**(--mH.end()));
	} 
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值