• LCP 37. 最小矩形面积


    我们发现对于对答案有影响的点只能有斜率相邻的线能够产生,因此我们可以把斜率相同的放在一组,相邻计算即可。

    class Solution {
    public:
        static bool cmp(pair<int,int> x,const pair<int,int> y){
            if(x.first!=y.first)return x.first<y.first;
            else return x.second<y.second;
        }
        double minRecSize(vector<vector<int>>& lines) {
            map<int,pair<int,int> > sq;//up down max
            pair<int,int> st[123456];
            int len=(int)lines.size();
            for(int i=0;i<(int)lines.size();i++){
                st[i]=make_pair(lines[i][0],lines[i][1]);
            }
            //cout<<st[0].first<<" "<<st[0].second<<endl;
            sort(st,st+len,cmp);
            double l,u,r,d;
            l=u=r=d=0;
            int count=0;
            sq[st[0].first]=make_pair(st[0].second,st[0].second);
            int last=st[0].first;
            //cout<<sq[last].first<<" "<<sq[last].second<<endl;
            for(int i=1;i<len;i++){
                //cout<<l<<" "<<r<<" "<<u<<" "<<d<<endl;
                if(st[i].first==st[i-1].first){
                    int q=st[i].first;
                    int s=st[i].second;
                    if(sq[q].first<s)sq[q].first=s;
                    if(sq[q].second>s)sq[q].second=s;
                    //crazy
                    if(q==last)continue;
                    int dd1=st[i].second-sq[last].first;
                int dd2=st[i].second-sq[last].second;
                int qq=st[i].first-last;
                double x1= -1.0*dd1/qq;
                double x2=-1.0*dd2/qq;
                double y1= st[i].first*x1+st[i].second;
                double y2=st[i].first*x2+st[i].second;
                if(count==0){
                    l=r=x1;
                    u=d=y1;
                }
                    if(x1>r)r=x1;
                    if(x1<l)l=x1;
                    if(y1>u)u=y1;
                    if(y1<d)d=y1;
                    if(x2>r)r=x2;
                    if(x2<l)l=x2;
                    if(y2>u)u=y2;
                    if(y2<d)d=y2;
            
                count++;
                    continue;
                }
                last=st[i-1].first;
                //bug 
                sq[st[i].first]=make_pair(st[i].second,st[i].second);
                int dd1=st[i].second-sq[last].first;
                int dd2=st[i].second-sq[last].second;
                int q=st[i].first-last;
                double x1= -1.0*dd1/q;
                double x2=-1.0*dd2/q;
                double y1= st[i].first*x1+st[i].second;
                double y2=st[i].first*x2+st[i].second;
                if(count==0){
                    l=r=x1;
                    u=d=y1;
                }
                    if(x1>r)r=x1;
                    if(x1<l)l=x1;
                    if(y1>u)u=y1;
                    if(y1<d)d=y1;
                    if(x2>r)r=x2;
                    if(x2<l)l=x2;
                    if(y2>u)u=y2;
                    if(y2<d)d=y2;
            
                count++;
            }
            if(!count)return 0;
            else return fabs(u-d)*fabs(l-r);
        }
    };
  • 相关阅读:
    时间转换成时间戳
    元字符为名称的时候,使用两个反斜杠转义:\
    批量修改文件夹及文件用户权限和用户组权限 centos
    HDU6797 多校第三场 Tokitsukaze and Rescue
    AtCoder Regular Contest 103 E
    2020牛客第六场 B题 Binary Vector
    Codeforces Round #659 (Div. 2) B1. Koa and the Beach (Easy Version)
    Codeforces Round #659 (Div. 2) C. String Transformation 1
    Codeforces Round #659 (Div. 2) D GameGame
    P3194 [HNOI2008]水平可见直线 计算几何栈维护下凸壳
  • 原文地址:https://www.cnblogs.com/Ean1zhi/p/15760838.html
Copyright © 2020-2023  润新知