1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
#include<bits/stdc++.h> using namespace std;
using i64=long long;
constexpr int N=1e5+5;
int n; vector<array<int,4>> arr; vector<int> X,Y; i64 ans; struct tree{ int tot; int rt[N]; int lc[N<<7]; int rc[N<<7]; i64 maxn[N<<7]; void add(int &x,int l,int r,int pos,i64 val){ if(!x) x=++tot; if(l==r){ maxn[x]=max(maxn[x],val); return; } int mid=l+r>>1; if(pos<=mid) add(lc[x],l,mid,pos,val); else add(rc[x],mid+1,r,pos,val); maxn[x]=max(maxn[lc[x]],maxn[rc[x]]); return; } i64 search(int x,int l,int r,int ql,int qr){ if(!x||ql>qr) return 0; if(l>=ql&&r<=qr) return maxn[x]; int mid=l+r>>1; i64 res=0; if(mid>=ql) res=max(res,search(lc[x],l,mid,ql,qr)); if(mid+1<=qr) res=max(res,search(rc[x],mid+1,r,ql,qr)); return res; } }tr; struct BIT2D{ int n,m; BIT2D(){} BIT2D(int _n,int _m){ n=_n; m=_m; } void add(int x,int y,i64 k){ for(int i=x;i<=n;i+=(i&-i)) tr.add(tr.rt[i],1,m,y,k); } i64 search(int x,int y){ if(x==0||y==0) return 0; i64 res=0; for(int i=x;i;i-=(i&-i)) res=max(res,tr.search(tr.rt[i],1,m,1,y)); return res; } }bit2d;
int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
cin>>n; for(int i=1,t,x,y,a;i<=n;i++){ cin>>t>>x>>y>>a; if(t-x-y<0||t+x-y<0) continue; arr.push_back({y,t-x-y,t+x-y,a}); X.push_back(t-x-y); Y.push_back(t+x-y); } sort(arr.begin(),arr.end()); X.push_back(0); sort(X.begin(),X.end()); X.erase(unique(X.begin(),X.end()),X.end()); Y.push_back(0); sort(Y.begin(),Y.end()); Y.erase(unique(Y.begin(),Y.end()),Y.end()); bit2d=BIT2D(X.size(),Y.size()); for(auto [y,a,b,val]:arr){ a=lower_bound(X.begin(),X.end(),a)-X.begin()+1; b=lower_bound(Y.begin(),Y.end(),b)-Y.begin()+1; i64 res=bit2d.search(a,b); ans=max(ans,res+val); bit2d.add(a,b,res+val); } cout<<ans;
return true&&false; }
|