最后一个点 #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;
}