【Usaco2015 JAN】Cow Rectangles
来源:互联网 发布:悦木之源泥娃娃知乎 编辑:程序博客网 时间:2024/05/17 03:11
很丑
另一份代码
还没有。。。。
#include<cstdio>#include<algorithm>using namespace std;const int maxm = 500 + 10;const int maxn = 1000 + 10;const int INF = 0xfffffff;int pre[maxn][maxn], n, l, r, d, u;char ch;struct answer{ int point, area;}ans;struct G{ int x, y;}Gsx[maxm];int cnt, nowpoint;void Readin(){ scanf("%d", &n); int x, y; l = d = INF; u = r = -INF; for(int i = 1; i <= n; i ++){ scanf("%d %d %c", &x, &y, &ch); x ++; y ++; if(ch == 'H') pre[y][x] ++; else Gsx[++ cnt] = (G){x, y}; l = min(l, x); r = max(r, x); d = min(d, y); u = max(u, y); }}bool Cmpx(G a, G b){ return a.x == b.x ? a.y < b.y : a.x < b.x;}void Init(){ for(int i = d; i <= u; i ++) for(int j = l; j <= r; j ++) pre[i][j] += (pre[i][j - 1] + pre[i - 1][j] - pre[i - 1][j - 1]); sort(Gsx + 1, Gsx + cnt + 1, Cmpx); Gsx[cnt + 1] = (G){r + 1, 0};}void Check(){ for(int i = u; i >= d; i --){ for(int j = l; j <= r; j ++) printf("%d ", pre[i][j]); printf("\n"); } printf("\n"); for(int i = 1; i <= cnt; i ++) printf("(%d, %d) ", Gsx[i].x, Gsx[i].y);}int Ef(int up, int down, int left, int right, int point){ int uu = up - 1, dd = down + 1; while(uu > dd){ int mid = (uu + dd) / 2; if(pre[mid][right - 1] - pre[down][right - 1] - pre[mid][left] + pre[down][left] < point) dd = mid + 1; else if(pre[mid - 1][right - 1] - pre[down][right - 1] - pre[mid - 1][left] + pre[down][left] == point) uu = mid - 1; else{ uu = mid; break; } } up = uu; dd = down + 1; while(uu > dd){ int mid = (uu + dd) / 2; if(pre[up][right - 1] - pre[mid - 1][right - 1] - pre[up][left] + pre[mid - 1][left] < point) uu = mid - 1; else if(pre[up][right - 1] - pre[mid][right - 1] - pre[up][left] + pre[mid][left] == point) dd = mid + 1; else{ dd = mid; break; } } down = dd; int ll = left + 1, rr = right - 1; while(ll < rr){ int mid = (ll + rr) / 2; if(pre[up][right - 1] - pre[down - 1][right - 1] - pre[up][mid - 1] + pre[down - 1][mid - 1] < point) rr = mid - 1; else if(pre[up][right - 1] - pre[down - 1][right - 1] - pre[up][mid] + pre[down - 1][mid] == point) ll = mid + 1; else{ ll = mid; break; } } left = ll; rr = right - 1; while(ll < rr){ int mid = (ll + rr) / 2; if(pre[up][mid] - pre[down - 1][mid] - pre[up][left - 1] + pre[down - 1][left - 1] < point) ll = mid + 1; else if(pre[up][mid - 1] - pre[down - 1][mid - 1] - pre[up][left - 1] + pre[down - 1][left - 1] == point) rr = mid - 1; else{ rr = mid; break; } } right = rr; return (right - left) * (up - down);}void Solve(){ int down, up; ans.area = INF; ans.point = -1; for(int i = 1; i <= cnt; i ++){ down = d - 1; up = u + 1; for(int j = i + 1; j <= cnt + 1; j ++) if(Gsx[j].y < up && Gsx[j].y > down || j == cnt + 1){ nowpoint = pre[up - 1][Gsx[j].x - 1] - pre[down][Gsx[j].x - 1] - pre[up - 1][Gsx[i].x] + pre[down][Gsx[i].x]; if(nowpoint < ans.point || nowpoint == 0){ if(Gsx[j].y > Gsx[i].y) up = Gsx[j].y; else if(Gsx[j].y < Gsx[i].y) down = Gsx[j].y; else break; continue; } else{ if(ans.point < nowpoint){ ans.point = nowpoint; ans.area = Ef(up, down, Gsx[i].x, Gsx[j].x, nowpoint); } else ans.area = min(ans.area, Ef(up, down, Gsx[i].x, Gsx[j].x, nowpoint)); } if(Gsx[j].y > Gsx[i].y) up = Gsx[j].y; else if(Gsx[j].y < Gsx[i].y) down = Gsx[j].y; else break; } } for(int i = d; i <= u; i ++){ down = d - 1; up = u + 1; for(int j = 1; j <= cnt + 1; j ++) if(Gsx[j].y < up && Gsx[j].y > down || j == cnt + 1){ nowpoint = pre[up - 1][Gsx[j].x - 1] - pre[down][Gsx[j].x - 1] - pre[up - 1][l - 1] + pre[down][l - 1]; if(nowpoint < ans.point){ if(Gsx[j].y > i) up = Gsx[j].y; else if(Gsx[j].y < i) down = Gsx[j].y; else break; continue; } else{ if(ans.point < nowpoint){ ans.point = nowpoint; ans.area = Ef(up, down, l - 1, Gsx[j].x, nowpoint); } else ans.area = min(ans.area, Ef(up, down, l - 1, Gsx[j].x, nowpoint)); } if(Gsx[j].y > i) up = Gsx[j].y; else if(Gsx[j].y < i) down = Gsx[j].y; else break; } } printf("%d\n%d", ans.point, ans.area);}int main(){ freopen("cowrect.in", "r", stdin); freopen("cowrect.out", "w", stdout); Readin(); Init();// Check(); Solve(); return 0;}
又写丑了好丑好丑真丑啊啊
又写丑了好丑好丑真丑啊啊
又写丑了好丑好丑真丑啊啊
又写丑了好丑好丑真丑啊啊
又写丑了好丑好丑真丑啊啊
又写丑了好丑好丑真丑啊啊
又写丑了好丑好丑真丑啊啊
又写丑了好丑好丑真丑啊啊
1 0
- 【Usaco2015 JAN】Cow Rectangles
- BZOJ3885: [Usaco2015 Jan]Cow Rectangles(悬线法)
- BZOJ 3885 Usaco2015 Jan Cow Rectangles 单调队列+二分
- 【BZOJ3885】【Usaco2015 Jan】Cow Rectangles 某奇怪的最大子矩形
- bzoj3889【Usaco2015 Jan】Cow Routing
- [BZOJ3889]USACO2015 Jan-Cow|最短路
- 【bzoj3889】[Usaco2015 Jan]Cow Routing 最短路
- bzoj 3889: [Usaco2015 Jan]Cow Routing SPFA
- 【BZOJ3889】【Usaco2015 Jan】Cow Routing 双键值最短路
- BZOJ 3889: [Usaco2015 Jan]Cow Routing 双键值最短路
- bzoj3888【Usaco2015 Jan】Stampede
- 图例练习题:【BZOJ3889】【Usaco2015 Jan】Cow Routing 双键值最短路
- bzoj3890【Usaco2015 Jan】Meeting Time
- BZOJ 3888: [Usaco2015 Jan]Stampede
- 【Usaco2015 JAN】Moovie Mooving 题解
- BZOJ3939 [Usaco2015 Feb]Cow Hopscotch
- BZOJ3939: [Usaco2015 Feb]Cow Hopscotch
- bzoj3890 [Usaco2015 Jan]Meeting Time [spfa + A*]
- eclipse出现 Intent cannot be resolved to a type解决方法。
- Android布局中的layout_weight和weightSum属性的详解及使用
- HDOJ 1233 还是畅通工程
- android下camera数据流的分析
- android Security Tips
- 【Usaco2015 JAN】Cow Rectangles
- Qt的事件机制和用途
- 《春日记》开发记录【4】
- 用POI获取excel表中的图片位置及数据
- 【面试】iOS 开发面试题(三)
- iOS键盘的弹出与关闭总结
- 百度前端面试题目整理
- 1.(c语言)产生随机数(rand()和srand()的配合使用)
- 《Effective C++》学习笔记——条款40