uva_1338_distant galaxy

来源:互联网 发布:产品原型设计软件 编辑:程序博客网 时间:2024/05/17 07:50
#include<iostream>      #include<sstream>      #include<string>      #include<vector>      #include<list>      #include<set>      #include<map>    #include<stack>      #include<queue>      #include<algorithm>      #include<numeric>      #include<cmath>    #include<cstdio>    #include<cstdlib>    #include<cstring>    #pragma warning(disable:4996)   using namespace std;class Point{public:int x, y;friend bool operator<(const Point& a, const Point& b){if (a.x != b.x){return a.x < b.x;}return a.y < b.y;}};int getAns(const vector<Point>&coordinate, vector<int>&coordinate_y){int ans = 0;for (size_t i = 0; i < coordinate_y.size(); i++){for (size_t j = i + 1; j < coordinate_y.size(); j++){int y_min = coordinate_y[i], y_max = coordinate_y[j], line = -1;vector<int>left(coordinate.size()), on1(coordinate.size()), on2(coordinate.size());for (int k = 0; k < coordinate.size(); k++){if (!k || coordinate[k].x != coordinate[k - 1].x){line++;if (line){left[line] = left[line - 1] + on2[line - 1] - on1[line - 1];}}if (coordinate[k].y > y_min && coordinate[k].y < y_max){on1[line]++;}if (coordinate[k].y >= y_min && coordinate[k].y <= y_max){on2[line]++;}}int increment = 0;for (int t = 0; t <= line; t++){ans = max(ans, left[t] + on2[t] + increment);increment = max(increment, on1[t] - left[t]);}}}return ans;}int main(){//freopen("input.txt", "r", stdin);    //freopen("output.txt", "w", stdout);int n, cas = 1;while (cin >> n && n){//接收数据&离散化vector<Point>coordinate(n);vector<int>coordinate_y(n);map<int, int>discrete_x, discrete_y;for (int i = 0; i < n; i++){cin >> coordinate[i].x >> coordinate[i].y;discrete_x.insert({ coordinate[i].x,0 });discrete_y.insert({ coordinate[i].y,0 });}int count = 0;for (auto iter = discrete_x.begin(); iter != discrete_x.end(); iter++){iter->second = count++;}count = 0;for (auto iter = discrete_y.begin(); iter != discrete_y.end(); iter++){iter->second = count++;}for (int i = 0; i < n; i++){coordinate[i].x = discrete_x[coordinate[i].x];coordinate_y[i] = coordinate[i].y = discrete_y[coordinate[i].y];}if (discrete_x.size() <= 2 || discrete_y.size() <= 2){printf("Case %d: %d\n", cas++, n);continue;}sort(coordinate.begin(), coordinate.end());sort(coordinate_y.begin(), coordinate_y.end());auto iter = unique(coordinate_y.begin(), coordinate_y.end());coordinate_y.resize(iter - coordinate_y.begin());printf("Case %d: %d\n", cas++, getAns(coordinate, coordinate_y));}return 0;}

0 0
原创粉丝点击