Written by razrlele
21:31 March 19, 2015
好可惜的一道题目,基本上只要对set和multiset熟悉一点就可以过,果然STL基本功还是不扎实啊。。。
题意就是要从横着竖着一刀一刀地切,然后求每次切割过后最大的一块玻璃面积是多少,结合题目下方可秒懂。思路自然而然就是每次切割完成过后分别求出最长的宽和最长的高。
那么这个关键地方就在于怎么在每次切割过后求出最长的宽和高。一开始我还想把每一段都保存下来然后每次都求一次宽或者高的最大值,结果自然而然TLE了。。。
后来还是看了别人的代码,首先存切下来的每一段长度肯定是不靠谱的,因为这样还得加来加去以求要切的是哪一块玻璃,应该直接使用set存每一刀的坐标,然后用lower_bound函数瞬间锁定切的是哪一块玻璃,再用multiset存每一段的长度。。。
1.4s过的,估计就是数据输入还是有点多所以cin/cout略慢。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
/******************************************************** * File Name: C.cpp * Author: razrLeLe * Mail: razrlele@gmail.com * Homepage: https://yueyu.io * Created Time: Tue 17 Mar 2015 11:46:28 PM CST ******************************************************/ #include "vector" #include "set" #include "deque" #include "queue" #include "algorithm" #include "functional" #include "iostream" #include "cstdio" #include "cmath" #include "cstdlib" #include "string" #include "cstring" #include "string.h" #include "map" #include "cctype" #include "list" #include "stack" using namespace std; #define INF 0x3f3f3f3f #define LOCAL typedef long long ll; ll w, h, n; set x, y; set::iterator it1, it2; multiset xmax, ymax; int main() { #ifdef LOCAL freopen("/home/razrlele/build/data.txt", "r", stdin); freopen("/home/razrlele/build/out.txt", "w", stdout); #endif while(cin >> w >> h >> n) { x.insert(0);x.insert(w); y.insert(0);y.insert(h); xmax.insert(w); ymax.insert(h); char tmpc; ll tmpt; for(ll i = 0; i < n; i++) { cin >> tmpc >> tmpt; ll sum = 0; if(tmpc == 'H') { it1 = y.lower_bound(tmpt); it2 = --it1; ++it1; ll num = *it1 - *it2; y.insert(tmpt); ymax.erase(ymax.find(num)); ymax.insert(tmpt-*it2); ymax.insert(*it1-tmpt); } else if(tmpc == 'V') { it1 = x.lower_bound(tmpt); it2 = --it1; ++it1; ll num = *it1 - *it2; x.insert(tmpt); xmax.erase(xmax.find(num)); xmax.insert(tmpt-*it2); xmax.insert(*it1-tmpt); } cout << (ll)(*xmax.rbegin())*(*ymax.rbegin()) << endl; } xmax.clear(); ymax.clear(); x.clear(); y.clear(); } return 0; } |