A题
CDQ分治,待做。
B题
枚举矩形的左下角和右上角。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Pt{
int x;
int y;
}p[35];
struct Rect{
int x1;
int y1;
int x2;
int y2;
}r[1000];
int vis[210][210];
int main()
{
int n;
while (scanf("%d", &n) && n)
{
int l = 0;
memset(vis, 0, sizeof(vis));
int i, j, k;
for (i = 0; i < n; i++)
{
scanf("%d%d", &p[i].x, &p[i].y);
vis[p[i].x][p[i].y] = 1;
}
for (i = 0; i < n; i++)
{
for (j = p[i].x + 1; j <= 200; j++)
{
if (vis[j][p[i].y])
{
for (k = p[i].y + 1; k <= 200; k++)
{
if (vis[p[i].x][k] && vis[j][k])
{
r[l].x1 = p[i].x;
r[l].y1 = p[i].y;
r[l].x2 = j;
r[l].y2 = k;
l++;
}
}
}
}
}
int sum = 0;
for (i = 0; i < l; i++)
{
for (j = i + 1; j < l; j++)
{
int s = 0;
if ((r[i].x1 - r[j].x1) * (r[i].x2 - r[j].x2) < 0 && (r[i].y1 - r[j].y1) * (r[i].y2 - r[j].y2) < 0)
{
s = max((r[i].y2 - r[i].y1) * (r[i].x2 - r[i].x1), (r[j].y2 - r[j].y1) * (r[j].x2 - r[j].x1));
}
else if (r[i].x1 > r[j].x2 || r[i].x2 < r[j].x1 || r[i].y1 > r[j].y2 || r[i].y2 < r[j].y1)
{
s = (r[i].y2 - r[i].y1) * (r[i].x2 - r[i].x1) + (r[j].y2 - r[j].y1) * (r[j].x2 - r[j].x1);
}
sum = max(sum, s);
}
}
if (sum)printf("%d\n", sum);
else printf("ivis\n");
}
}
E题
时间给的比较宽,所以暴力就可以了。