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
| #include <bits/stdc++.h> using namespace std; const int N=1000010,M=10000010; int n,MX[N],am[N],ss; struct node{int l,r,c,w;}q[N]; bool operator<(node a,node b){return a.r<b.r;} void insert(int p,int l,int r,int x,int y){ if(l==r)return (void)(MX[p]=y); int mid=(l+r)>>1; if(mid>=x)insert(p<<1,l,mid,x,y); else insert(p<<1|1,mid+1,r,x,y); MX[p]=max(MX[p<<1],MX[p<<1|1]); } namespace SEG{ int rt[N],ls[M],rs[M],idx,mx[M],tag[M]; void pls(int p,int q,int x){mx[p]=max(mx[p]+x,MX[q]+x);tag[p]+=x;} void down(int p,int q){ if(!tag[p])return ; if(!ls[p])ls[p]=++idx; if(!rs[p])rs[p]=++idx; pls(ls[p],q<<1,tag[p]); pls(rs[p],q<<1|1,tag[p]); tag[p]=0; } void add(int &p,int q,int l,int r,int ql,int qr,int x){ if(!p)p=++idx; if(ql<=l&r<=qr)return pls(p,q,x); int mid=(l+r)>>1; down(p,q); if(mid>=ql)add(ls[p],q<<1,l,mid,ql,qr,x); if(mid<qr)add(rs[p],q<<1|1,mid+1,r,ql,qr,x); mx[p]=max(mx[ls[p]],mx[rs[p]]); } int query(int p,int q,int l,int r,int ql,int qr){ if(!p)return 0; if(ql<=l&&r<=qr)return mx[p]; int mid=(l+r)>>1,res=0; down(p,q); if(mid>=ql)res=max(res,query(ls[p],q<<1,l,mid,ql,qr)); if(mid<qr)res=max(res,query(rs[p],q<<1|1,mid+1,r,ql,qr)); return res; } }using namespace SEG; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d%d%d%d",&q[i].l,&q[i].r,&q[i].c,&q[i].w); for(int i=1;i<=n;i++)am[++ss]=q[i].c; sort(am+1,am+1+ss); ss=unique(am+1,am+1+ss)-am-1; for(int i=1;i<=n;i++)q[i].c=lower_bound(am+1,am+1+ss,q[i].c)-am; sort(q+1,q+1+n); for(int i=1;i<=n;i++){ int l=0,r=i-1; while(l<r){ int mid=(l+r+1)>>1; if(q[mid].r<q[i].l)l=mid; else r=mid-1; } add(rt[q[i].c],1,0,n,0,l,q[i].w); insert(1,0,n,i,mx[rt[q[i].c]]); } printf("%d\n",MX[1]); return 0; }
|