SPOJ - WMELON(离散化+暴力or离散化+线段树)【待完善】

来源:互联网 发布:郑州淘宝加盟判刑 编辑:程序博客网 时间:2024/05/17 05:16

题意:

给出n个点坐标和他们各自的值,求满足条件"矩形内的点值的和不小于k"的最小矩形面积。

1、离散+暴力

思路,先对y坐标离散化,然后确定两条平行与x轴的直线,求两条直线内满足条件的最小的矩形面积。

n^3的复杂度,过的有点危险。

代码如下:

#include <cstdio>#include <queue>#include <algorithm>#include <vector>#include <cstring>using namespace std;#define M 1005struct node{    int x, y, v;    bool operator < (const node &xx) const {        return y<xx.y;    }    node(int a, int b, int c): x(a), y(b), v(c){}};int n, k, minx, maxx, ans, x[M], y[M];vector<node>q;void solve(int i, int j){    int l, r, cur;    int w = y[j]-y[i];    l = r = minx;    cur = x[l];    while(r<=maxx)    {        if(cur<k)        {            r++;            cur+=x[r];        }        else        {            ans = min(ans, w*(r-l));            cur-=x[l];            l++;        }    }}int main (){    int t;    scanf("%d",&t);    while(t--)    {        q.clear();        scanf("%d %d",&n, &k);        int a, b, c;        minx = 0xffffffff;        maxx = 0;        for(int i = 0; i < n; ++i)        {            scanf("%d %d %d",&a, &b, &c);            minx = min(minx,a);            maxx = max(maxx,a);            y[i] = b;            q.push_back(node(a,b,c));        }        sort(y,y+n);        sort(q.begin(),q.end());        int len = unique(y,y+n)-y;        if(len==1) { printf("0\n"); continue; }        ans = 0xfffffff;        for(int i = 0; i < len; ++i)            for(int j = i+1; j < len; ++j)            {                memset(x,0,sizeof(x));                for(int k = 0; k < (int)q.size(); ++k)                    if(q[k].y>y[j]) break;                    else if(q[k].y>=y[i]&&q[k].y<=y[j])                        x[q[k].x]+=q[k].v;                solve(i,j);            }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击