• LC 面试题 08.13. Pile Box LCCI


    link

     题解:

    按高度升序排序,若高度相同,按宽度降序排序。到i后,用线段树找w,d 在[0,0]-[wi-1,di-1]的最大值,更新此节点。

    class Solution {
    public:
        unordered_map<int,int> seg[3010<<2];
        int qx1,qy1,qx2,qy2;
        int x,y,val;
        int n;
        int cur;
        int queryx(int idx, int xleft, int xright){
            if(xleft>xright || qx1>xright || qx2<xleft) return 0;
            if(qx1<=xleft && qx2>=xright){
                int res=queryy(idx,0,0,n);
                return res;
            }
    
            int mid=(xleft+xright)/2;
            int l=queryx(idx*2+1,xleft,mid);
            int r=queryx(idx*2+2,mid+1,xright);
            return max(l,r);
        }
        int queryy(int idx, int idy, int yleft, int yright){
            if(qy1>yright || qy2<yleft) return 0;
            if(qy1<=yleft && qy2>=yright) return seg[idx][idy];
    
            int mid=(yleft+yright)/2;
            int l=queryy(idx,idy*2+1,yleft,mid);
            int r=queryy(idx,idy*2+2,mid+1,yright);
            return max(l,r);
        }
    
        void updatex(int idx, int xleft, int xright){
            if(xleft>xright || x<xleft || x>xright) return;
            if(xleft==xright){
                updatey(idx,xleft,xright,0,0,n);
                return;
            }
            int mid=(xleft+xright)/2;
            updatex(idx*2+1,xleft,mid);
            updatex(idx*2+2,mid+1,xright);
            updatey(idx,xleft,xright,0,0,n);
        }
    
        void updatey(int idx, int xleft, int xright, int idy, int yleft, int yright){
            if(yleft>yright || y<yleft || y>yright) return;
            if(yleft==yright){
                if(xleft==xright) {
                    seg[idx][idy]=val;
                }
                else seg[idx][idy]=max(seg[idx*2+1][idy],seg[idx*2+2][idy]);
                return;
            }
            int mid=(yleft+yright)/2;
            updatey(idx,xleft,xright,idy*2+1,yleft,mid);
            updatey(idx,xleft,xright,idy*2+2,mid+1,yright);
            seg[idx][idy]=max(seg[idx][idy*2+1],seg[idx][idy*2+2]);
        }
    
        int pileBox(vector<vector<int>>& box) {
            unordered_map<int,int> wid;
            unordered_map<int,int> did;
            sort(box.begin(),box.end(),[](vector<int>& v1, vector<int>& v2){
                return v1[0]<v2[0];
            });
            n=box.size();
            for(int i=0;i<n;i++){
                if(i==0) wid[box[i][0]]=1;
                else {
                    if(box[i][0]>box[i-1][0]) wid[box[i][0]]=i+1;
                }
            }
            sort(box.begin(),box.end(),[](vector<int>& v1, vector<int>& v2){
                return v1[1]<v2[1];
            });
            for(int i=0;i<n;i++){
                if(i==0) did[box[i][1]]=1;
                else {
                    if(box[i][1]>box[i-1][1]) did[box[i][1]]=i+1;
                }
            }
            sort(box.begin(),box.end(),[](vector<int>& v1, vector<int>& v2){
                return v1[2]==v2[2]?v1[0]>v2[0]: v1[2]<v2[2];
            });
          
            int res=0;
            vector<int> dp(n,0);
            for(int i=0;i<n;i++){
                qx1=0;
                qy1=0;
                qx2=wid[box[i][0]]-1;
                qy2=did[box[i][1]]-1;
                int q=queryx(0,0,n);
                dp[i]=q+box[i][2];
                res=max(res,dp[i]);
                x=wid[box[i][0]];
                y=did[box[i][1]];
                val=dp[i];
                cur=i;
                updatex(0,0,n);
            }
            return res;
        }
    
       
    };
  • 相关阅读:
    hdu 1715 大菲波数
    Netty 应用程序的一个一般准则:尽可能的重用 EventLoop,以减少线程创建所带来的开销。
    引入 netty网关,向flume提交数据
    JavaBean的任务就是: “Write once, run anywhere, reuse everywhere” Enterprise JavaBeans
    API网关+Kubernetes集群的架构替代了传统的Nginx(Ecs)+Tomcat(Ecs)
    tmp
    全量日志 requestId
    googlr 黄金法则 监控
    数据链路层3个基本问题
    netty4.x 实现接收http请求及响应
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12970710.html
Copyright © 2020-2023  润新知