HDU2478(Slides)求四边形矩阵交

来源:互联网 发布:ipad看电视最新软件 编辑:程序博客网 时间:2024/05/16 07:57
/**********************************************************题意:给出n个矩形,从里面抽掉一个,求剩下的所有矩形的面积交;算法:由于数据量不超过100000,所以不需要用线段树优化,只需要O(n)预处理就行了;即从左往右处理[1,i]之间的矩形的面积交;再从右往左也处理一次[i,n]的面积交;然后枚举中间抽掉的矩形;最后求一次左右两边的面积交就OK了;**********************************************************/#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int N=100010;const int L=-1000001;const int R=1000001;int x1[N], x2[N], y1[N], y2[N];int main(){    //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);    int tcase;    while (~scanf("%d",&tcase))    {        while (tcase--)        {            int n;            scanf("%d", &n);            int lx = L, ly = L, rx = R, ry = R;            int lx1 = L, ly1 = L, rx1 = R, ry1 = R;            for (int i = 0; i < n; i++)            {                scanf("%d%d%d%d", &x1[i], &y1[i], &x2[i], &y2[i]);                if (x1[i] > lx)                {                    lx1 = lx;                    lx = x1[i];                }                else if (x1[i] > lx1)                    lx1 = x1[i];                if (y1[i] > ly)                {                    ly1 = ly;                    ly = y1[i];                }                else if (y1[i] > ly1)                    ly1 = y1[i];                if (x2[i] < rx)                {                    rx1 = rx;                    rx = x2[i];                }                else if (x2[i] < rx1)                    rx1 = x2[i];                if (y2[i] < ry)                {                    ry1 = ry;                    ry = y2[i];                }                else if (y2[i] < ry1)                    ry1 = y2[i];            }            if (n==1)            {                printf("0\n");                continue;            }            int ans = 0;            int x,y;            int xx,yy;            for (int i = 0; i < n; i++)            {                if (x1[i] == lx)                    x = lx1;                else                    x = lx;                if (y1[i] == ly)                    y = ly1;                else                    y = ly;                if (x2[i] == rx)                    xx = rx1;                else                    xx = rx;                if (y2[i] == ry)                    yy = ry1;                else                    yy = ry;                if (yy > y && xx > x)                {                    int tmp = (yy - y)*(xx - x);                    if (tmp > ans)                        ans = tmp;                }            }            printf("%d\n",ans);        }    }    return 0;}