Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
算起来也写了一天多,虽然写的很搓,也算是AC了!//problem 1009 #include <iostream> #include <vector> using namespace std; struct rle { int value; int length; int index; }; vector<rle> v_in; vector<rle> v_out; void update_output(int value, int len) { if(v_out.empty() || value != v_out[v_out.size() - 1].value) { rle item; item.value = value; item.length = len; v_out.push_back(item); } else v_out[v_out.size() - 1].length += len; } int find_pre(int i, int k, int width) { int pre = i; int index = v_in[i].index + k - width; if(index >= 0) { while(v_in[pre].index > index) --pre; while(v_in[pre].index + v_in[pre].length <= index) ++pre; } else pre = -1; return pre; } int find_post(int i, int k, int width) { int post = i; int index = v_in[i].index + k + width; int n = v_in[v_in.size() - 1].index + v_in[v_in.size() - 1].length; if(index < n) { while(v_in[post].index > index) --post; while(v_in[post].index + v_in[post].length <= index) ++post; } else post = -1; return post; } int find_edge(int i, int k, int width) { int res = 0; int index = v_in[i].index + k; if(0 != index%width && index - 1 < v_in[i].index) { res = max(res, abs(v_in[i].value - v_in[i - 1].value)); } if(width - 1 != index%width && index + 1 >= v_in[i].index + v_in[i].length) { res = max(res, abs(v_in[i].value - v_in[i + 1].value)); } int pre = find_pre(i, k, width); int post = find_post(i, k, width); if(pre >= 0) { res = max(res, abs(v_in[i].value - v_in[pre].value)); if(0 != index%width && index - width - 1 < v_in[pre].index) res = max(res, abs(v_in[i].value - v_in[pre - 1].value)); if(width - 1 != index%width && index - width + 1 >= v_in[pre].index + v_in[pre].length) res = max(res, abs(v_in[i].value - v_in[pre + 1].value)); } if(post >= 0) { res = max(res, abs(v_in[i].value - v_in[post].value)); if(0 != index%width && index + width - 1 < v_in[post].index) res = max(res, abs(v_in[i].value - v_in[post - 1].value)); if(width - 1 != index%width && index + width + 1 >= v_in[post].index + v_in[post].length) res = max(res, abs(v_in[i].value - v_in[post + 1].value)); } return res; } int main() { int width; while(cin >> width && width) { v_in.clear(); v_out.clear(); int value, len; int index = 0; while(cin >> value >> len) { if(0 == value && 0 == len) break; rle item; item.value = value; item.length = len; item.index = index; v_in.push_back(item); index += len; } for(int i = 0; i < v_in.size(); ++i) { int lower = 0; int higher; int res; while(lower <= min(width - 1, v_in[i].length - 1)) { higher = min(width - 1, v_in[i].length - 1); int pre = find_pre(i, lower, width); int post = find_post(i, lower, width); if(pre < 0) higher = min(higher, width - 1 - v_in[i].index); else higher = min(higher, v_in[pre].index + v_in[pre].length - 1 + width - v_in[i].index); if(post >= 0) higher = min(higher, v_in[post].index + v_in[post].length - 1 - width - v_in[i].index); res = find_edge(i, lower, width); update_output(res, 1); if(higher > lower + 1) { res = find_edge(i, lower + 1, width); update_output(res, higher - lower - 1); } if(higher > lower) { res = find_edge(i, higher, width); update_output(res, 1); } lower = higher + 1; } if(lower < v_in[i].length) { res = find_edge(i, lower, width); update_output(res, 1); ++lower; } higher = v_in[i].length - 1 - width - 1; if(lower <= higher) { update_output(0, higher - lower + 1); lower = higher + 1; } while(lower < v_in[i].length) { higher = v_in[i].length - 1; int pre = find_pre(i, lower, width); int post = find_post(i, lower, width); if(pre < 0) higher = min(higher, width - 1 - v_in[i].index); else higher = min(higher, v_in[pre].index + v_in[pre].length - 1 + width - v_in[i].index); if(post >= 0) higher = min(higher, v_in[post].index + v_in[post].length - 1 - width - v_in[i].index); res = find_edge(i, lower, width); update_output(res, 1); if(higher > lower + 1) { res = find_edge(i, lower + 1, width); update_output(res, higher - lower - 1); } if(higher > lower) { res = find_edge(i, higher, width); update_output(res, 1); } lower = higher + 1; } } cout << width << endl; for(int i = 0; i < v_out.size(); ++i) cout << v_out[i].value << " " << v_out[i].length << endl; cout << "0 0" << endl; } cout << "0" << endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator