求优化常数 qwq
查看原帖
求优化常数 qwq
305891
Eraine楼主2024/6/12 19:16

最后一个点 #11 TLE,实测 1.13s。求助各位谷民有无卡常的方法。谢谢 qwq

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e4+5;
const int inf=1e5;
int cmptype=-1;
struct Point{
    int id,x0;
    vector<int>x;
    ll val;
    inline friend bool operator<(Point A,Point B){
        if(~cmptype){
            return A.x[cmptype]<B.x[cmptype];
        }
        if(A.x0!=B.x0){
            return A.x0<B.x0;
        }
        for(register int i=0;i<3;i++){
            if(A.x[i]!=B.x[i]){
                return A.x[i]<B.x[i];
            }
        }
        return A.id<B.id;
    }
}a[N];
int p[N],p2[N],idx;
struct node{
    int ch[2];
    int par;
    vector<int>l,r,x;
    ll val,maxn;
}tr[N];
ll ans;
#define Max(a,b) (a>b)?a:b
struct KDTree{
    #define lc tr[i].ch[0]
    #define rc tr[i].ch[1]
    #define mid (l+r)/2
    void build(int &i,int l,int r,vector<int>L,vector<int>R,int type){
        if(l>r){
            return;
        }
        i=++idx;
        cmptype=type;
        nth_element(a+l,a+mid,a+r+1);
        vector<int>L1=L,R1=R;
        R1[type]=a[mid].x[type],L1[type]=a[mid].x[type];
        int type1=type+2;if(type1>=3)type1=type1-3;
        build(lc,l,mid-1,L,R1,type1);tr[lc].par=i;
        build(rc,mid+1,r,L1,R,type1);tr[rc].par=i;
        tr[i].l=L,tr[i].r=R,tr[i].x=a[mid].x;
        p[mid]=i;
    }
    void query(int i,vector<int>L,vector<int>R){
        if(!i){
            return;
        }
        auto check=[&](){
            for(register int d=0;d<3;++d){
                if(L[d]>tr[i].l[d]){
                    return 0;
                }
                if(R[d]<tr[i].r[d]){
                    return 0;
                }
            }
            return 1;
        };
        if(check()){
            ans=Max(ans,tr[i].maxn);
            return;
        }
        if(tr[i].maxn<=ans){
            return;
        }
        auto check2=[&](){
            for(register int d=0;d<3;++d){
                if(R[d]<tr[i].l[d]){
                    return 0;
                }
                if(L[d]>tr[i].r[d]){
                    return 0;
                }
            }
            return 1;
        };
        if(!check2()){
            return;
        }
        auto check3=[&](){
            for(register int d=0;d<3;++d){
                if(L[d]>tr[i].x[d]){
                    return 0;
                }
                if(R[d]<tr[i].x[d]){
                    return 0;
                }
            }
            return 1;
        };
        if(check3()){
            ans=Max(ans,tr[i].val);
        }
        query(lc,L,R);
        query(rc,L,R);
    }
    inline void update(int i,ll val){
        tr[i].val=Max(tr[i].val,val);
        while(i){
            tr[i].maxn=Max(tr[i].maxn,val);
            i=tr[i].par;
        }
    }
    #undef lc
    #undef rc
    #undef mid
}kdt;
int n,m,rt;
ll f[N];
int read(){
    int x=0,f=1;
    char c=getchar();
    while(!isdigit(c)){
        if(c=='-'){
            f=-1;
        }
        c=getchar();
    }
    while(isdigit(c)){
        x=(x<<3)+(x<<1)+c-'0';
        c=getchar();
    }
    return x*f;
}
int main(){
    n=read();
    vector<int>x(3);
    for(int i=1;i<=n;i++){
        a[i].x0=read();
        for(int j=0;j<3;j++){
            x[j]=read();
        }
        a[i].val=read();
        a[i].x=x;
        a[i].id=i;
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++){
        a[i].id=i;
    }
    kdt.build(rt,1,n,vector<int>(3,-inf),vector<int>(3,inf),2);
    for(int i=1;i<=n;i++){
        p2[a[i].id]=i;
    }
    ll res=0ll;
    for(int i=1;i<=n;i++){
        ans=0ll;
        kdt.query(rt,vector<int>(3,-inf),a[p2[i]].x);
        ans=ans+a[p2[i]].val;
        f[i]=ans;
        res=Max(res,f[i]);
        kdt.update(p[p2[i]],f[i]);
    }
    printf("%lld\n",res);
    return 0;
}
2024/6/12 19:16
加载中...