#include<bits/stdc++.h> #define FILE "read" using namespace std; const int INF=(int)1e9,MAXN=65000,D=50; struct node{int y,next,v,w,rel;}e[(MAXN+D)<<5]; int n,S,T,len,ans,c[MAXN+D],Link[MAXN+D],flow[MAXN+D],dis[MAXN+D],vis[MAXN+D],q[MAXN+D],lastnode[MAXN+D],lastedge[MAXN+D]; namespace INIT{ char buf[1<<15],*fs,*ft; inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;} inline int read(){ int x=0,f=1; char ch=getc(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();} while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();} return x*f; } }using namespace INIT; void insert(int x,int y,int v,int w){ e[++len].next=Link[x];Link[x]=len;e[len].y=y;e[len].v=v;e[len].w=-w;e[len].rel=len+1; e[++len].next=Link[y];Link[y]=len;e[len].y=x;e[len].v=0;e[len].w=w;e[len].rel=len-1; } void build(int p,int l,int r){ if(l>r) return; if(l==r){insert(p+n,T,1,0); return;} int mid=(l+r)>>1; insert(p+n,(p<<1)+n,INF,0); insert(p+n,(p<<1|1)+n,INF,0); build(p<<1,l,mid); build(p<<1|1,mid+1,r); } void find(int p,int l,int r,int x,int y,int i){ if(x>r||y<l) return; if(x<=l&&y>=r){ insert(i,p+n,1,c[i]); return; } int mid=(l+r)>>1; find(p<<1,l,mid,x,y,i); find(p<<1|1,mid+1,r,x,y,i); } bool spfa(){ memset(vis,0,sizeof(vis)); memset(dis,10,sizeof(dis)); int head=0,tail=1,oo=dis[0]; q[1]=S; vis[S]=1; dis[S]=0; flow[S]=INF; while(head!=tail){ int x=q[++head]; vis[x]=0; if(head==MAXN) head=0; for(int i=Link[x];i;i=e[i].next){ if(e[i].v&&e[i].w+dis[x]<dis[e[i].y]){ dis[e[i].y]=dis[x]+e[i].w; flow[e[i].y]=min(flow[x],e[i].v); lastnode[e[i].y]=x; lastedge[e[i].y]=i; if(!vis[e[i].y]){ q[++tail]=e[i].y; vis[e[i].y]=1; if(tail==MAXN) tail=0; } } } } if(dis[T]==oo) return 0; ans+=dis[T]*(-flow[T]); for(int i=T;i!=S;i=lastnode[i]){ e[lastedge[i]].v-=flow[T]; e[e[lastedge[i]].rel].v+=flow[T]; } return 1; } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); n=read(); S=0; T=30000; build(1,1,5000); for(int i=1;i<=n;++i){ int x=read(),y=read()-1; c[i]=read(); find(1,1,5000,x,y,i); insert(S,i,1,0); } while(spfa()); printf("%d\n",ans); return 0; }
|