#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;
}
uva_1338_distant galaxy
最新推荐文章于 2020-03-08 17:33:17 发布