#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 400030 #define M 1000000030 #define INF 0x7fffffff int n,s,t,a,b,w,l,r,p,tot,tot_edge,ans,head[N],iter[N],level[N],q[N],rt[N],ls[N],rs[N]; struct edge{int v,cap,rev,nxt;}e[N*8]; void add(int x,int y,int cap){ e[++tot_edge].v=y; e[tot_edge].cap=cap; e[tot_edge].rev=tot_edge+1; e[tot_edge].nxt=head[x]; head[x]=tot_edge; e[++tot_edge].v=x; e[tot_edge].cap=0; e[tot_edge].rev=tot_edge-1; e[tot_edge].nxt=head[y]; head[y]=tot_edge; } void bfs(int s){ int tt=0,ww=1; level[s]=0; q[1]=s; while (tt<ww){ int v=q[++tt]; for (int i=head[v];i;i=e[i].nxt){ edge &E=e[i]; if (E.cap>0 && level[E.v]<0){ level[E.v]=level[v]+1; q[++ww]=E.v; } } } } int dfs(int v,int t,int f){ if (v==t) return f; for (int &i=iter[v];i;i=e[i].nxt){ edge &E=e[i]; if (E.cap>0 && level[E.v]>level[v]){ int ff=dfs(E.v,t,min(f,E.cap)); if (ff>0){E.cap-=ff; e[E.rev].cap+=ff; return ff;} } } return 0; } int dinic(int s,int t){ int flow=0; for (;;){ memset(level,-1,sizeof level); bfs(s); if (level[t]<0) return flow; for (int i=s;i<=t;i++) iter[i]=head[i]; int f=0; while ((f=dfs(s,t,INF))>0) flow+=f; } } void ins(int &root,int root2,int l,int r,int k){ if (!root){root=++tot;} if (l==r){add(root,root2,INF); add(root,k,INF); return;} int mid=(l+r)>>1; if (a<=mid){ rs[root]=rs[root2]; ins(ls[root],ls[root2],l,mid,k); if (ls[root]) add(root,ls[root],INF); if (rs[root]) add(root,rs[root],INF); } if (a>mid){ ls[root]=ls[root2]; ins(rs[root],rs[root2],mid+1,r,k); if (ls[root]) add(root,ls[root],INF); if (rs[root]) add(root,rs[root],INF); } } void link(int root,int l,int r,int L,int R,int k){ if (!root) return; if (L<=l && R>=r){add(k,root,INF); return;} int mid=(l+r)>>1; if (L<=mid) link(ls[root],l,mid,L,R,k); if (R>mid) link(rs[root],mid+1,r,L,R,k); } int main(){ scanf("%d",&n); s=0; t=n*60+1; tot=n*2; for (int i=1;i<=n;i++){ scanf("%d%d%d%d%d%d",&a,&b,&w,&l,&r,&p); ans+=b+w; a++; l++; r++; add(s,i,b); add(i,t,w); add(i,i+n,p); link(rt[i-1],1,M,l,r,i+n); ins(rt[i],rt[i-1],1,M,i); } printf("%d\n",ans-dinic(s,t)); }
|