CodeForces - 527C Glass Carving (二分+set) 多维矩形切割问题

题意:

        给出一个高为 H ,宽为 V 的矩形。要经过 N 次切割,问每次切割后最大的一块是多少?

思路:

       为简化思考,本题题意为二维切割,我们不妨先考虑将问题转化为一位线段的切割问题思考。

       我们可以通过维护 切点 及 从每个切点开始的线段长度 得知每次操作后的最大长度。

       即 利用 数组 维护从每个切点开始的线段长度

            利用 set 维护 切点

            利用 multiset 维护 所有线段的长度 以便求最大长度

       在增加切点时利用 set 的二分查找和 multiset 的相关操作可以将效率压在 log(N)。

       二维,多维同理

代码:

#include <bits/stdc++.h>

using namespace std;
const int MAXN=2e5+100;
set <int> x;
set <int> y;
set <int>::iterator it;
multiset <int> ansx;
multiset <int> ansy;
multiset <int>::iterator it1,it2;
int lenx[MAXN];
int leny[MAXN];
char ch;
int n,m,k,v,temp;
long long mh,mv;
void ini(){
    x.clear();ansx.clear();
    y.clear();ansy.clear();
    memset(lenx,0,sizeof(lenx));memset(leny,0,sizeof(leny));
    ansx.insert(n); ansy.insert(m);//...........................最初的线段长度,即线段的总长
    x.insert(0);y.insert(0);
    x.insert(n);y.insert(m);//..................................将线段头尾设置为切点
    lenx[0]=n;lenx[n]=0;//......................................将线段头尾设成切点后,切点对应的线段长度
    leny[0]=m;leny[m]=0;
}
int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>m>>k){
        ini();
        while(k--){
            cin>>ch>>v;
            if(ch=='H'){
                it=y.lower_bound(v);--it;//.....................找到添加切点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值