码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces - 527C 平衡树维护几何

时间:2018-05-21 22:54:04      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:垂直   getc   its   割边   std   bit   ++   type   getch   

题意:给定一个矩形\(W*H\),一共\(n\)次切割操作(水平/垂直),求每次操作后得出的最大面积

随机按tag扫CF题目找到的题,可以分别用平衡树维护割边的位置和长度(\(x/y\)各两个)
具体操作看代码

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
using namespace std;
const int MAXN = 4e5+11;
const int INF = 0x7fffffff;
typedef long long ll;
ll read(){
    ll x=0,f=1;register char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
set<ll> st[2];
multiset<ll> mst[2];
char str[247];
int main(){
    ll w,h,n;
    while(cin>>w>>h>>n){
        rep(i,0,1) st[i].clear(),mst[i].clear();
        st[0].insert(0);st[1].insert(0);
        st[0].insert(w);mst[0].insert(w);//x length
        st[1].insert(h);mst[1].insert(h);//y height
        rep(i,1,n){
            scanf("%s",str);
            ll res=0;
            if(str[0]==‘H‘){
                ll y=read();
                set<ll>::iterator it1,it2;
                multiset<ll>::iterator it3,it4;
                it1=it2=st[1].lower_bound(y);
                it1--;
                ll yy1=*it1,yy2=*it2;
                st[1].insert(y); mst[1].erase(mst[1].find(yy2-yy1)); //只能往迭代器删.. 
                mst[1].insert(y-yy1); mst[1].insert(yy2-y);
                it3=mst[1].end();it4=mst[0].end();
                it3--;it4--;
                res=(*it3)*(*it4);
            }else{
                ll x=read();
                set<ll>::iterator it1,it2;
                multiset<ll>::iterator it3,it4;
                it1=it2=st[0].lower_bound(x);
                it1--;
                ll xx1=*it1,xx2=*it2;
                st[0].insert(x); mst[0].erase(mst[0].find(xx2-xx1)); 
                mst[0].insert(x-xx1); mst[0].insert(xx2-x);
                it3=mst[1].end();it4=mst[0].end();
                it3--;it4--;
                res=(*it3)*(*it4);
            }
            println(res);
        }
    }
    return 0;
}

Codeforces - 527C 平衡树维护几何

标签:垂直   getc   its   割边   std   bit   ++   type   getch   

原文地址:https://www.cnblogs.com/caturra/p/9069547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!