標籤:set multiset
這道題主要是 運用set和multiset
題意就是給你一個w*h大小的長方體,每次進行一個操作,然後看每次操作完之後的剩餘的最大的矩形的面積
這個過程的結果在小長方形的玻璃片段。不移動新製造的玻璃片段。特別是,削減將每個片段的玻璃經過成更小的片段。
意思就是碎的也不移動,不管什麼時候長方體的位置都沒有變,變得只是這個長方體成為了片段
所以用set 記錄被切割的位置
用 multiset 記錄現在完整方塊的長度與寬度,並且每一次要把切割位置的兩邊的相距長度從這個集合裡面減掉
#include <set>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 2*1e5+5;typedef long long LL;LL w, h, n;set <LL> st[2];multiset <LL> mst[2];LL solve(int t, int val) { set<LL>::const_iterator it = st[t].lower_bound(val); LL v1 = *it, v2 = *(--it); mst[t].erase(mst[t].find(v1-v2)); st[t].insert(val); mst[t].insert(v1-val); mst[t].insert(val-v2); return (*mst[t].rbegin())*(*mst[t^1].rbegin());}int main() { scanf("%I64d%I64d%I64d", &w, &h, &n); st[0].insert(0), st[0].insert(h); st[1].insert(0), st[1].insert(w); mst[0].insert(h), mst[1].insert(w); char ch; int val; for(int i = 1;i <= n; i++) { getchar(); scanf("%c %d", &ch, &val); printf("%I64d\n", ch == 'H' ? solve(0, val):solve(1, val)); } return 0;}
C. Glass Carving