被坑坏了。。。本来想练一下zkw,结果TLE
这个值域可以到LL范围。。。
这么sb的费用流就没什么好说的了
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int inf=(1<<30)-1; struct node { int x,y,c,next;LL d; }a[310000];int len,last[21000]; void ins(int x,int y,int c,LL d) { len++; a[len].x=x;a[len].y=y;a[len].c=c;a[len].d=d; a[len].next=last[x];last[x]=len; len++; a[len].x=y;a[len].y=x;a[len].c=0;a[len].d=-d; a[len].next=last[y];last[y]=len; } int st,ed; int pre[21000],cc[21000];LL d[21000],ans; int list[21000];bool v[21000]; bool spfa() { memset(d,63,sizeof(d));d[st]=0;cc[st]=(1<<30); memset(v,false,sizeof(v));v[st]=true; int head=1,tail=2;list[1]=st; while(head!=tail) { int x=list[head]; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(a[k].c>0&&d[y]>d[x]+a[k].d) { d[y]=d[x]+a[k].d; cc[y]=min(a[k].c,cc[x]); pre[y]=k; if(v[y]==false) { v[y]=true; list[tail]=y; tail++;if(tail==20100)tail=1; } } } v[x]=false; head++;if(head==20100)head=1; } if(d[ed]==d[0])return false; else { int y=ed;ans+=cc[ed]*d[ed]; while(y!=st) { int k=pre[y]; a[k].c-=cc[ed]; a[k^1].c+=cc[ed]; y=a[k].x; } return true; } } int c[310],aa[310][310]; int Tlen[310],T[310][10],z,id[310][10];LL w[310][10]; int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); int m,n; scanf("%d%d",&m,&n); st=1,ed=2; len=1;memset(last,0,sizeof(last)); for(int i=1;i<=n;i++) { scanf("%d",&c[i]); ins(st,i+2,c[i],0); } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) scanf("%d",&aa[i][j]); z=n+2; for(int i=1;i<=m;i++) { scanf("%d",&Tlen[i]); for(int j=1;j<=Tlen[i];j++)scanf("%d",&T[i][j]); T[i][Tlen[i]+1]=inf+T[i][Tlen[i]]; for(int j=1;j<=Tlen[i]+1;j++) { scanf("%lld",&w[i][j]),id[i][j]=++z; ins(id[i][j],ed,T[i][j]-T[i][j-1],0); } } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) if(aa[i][j]==1) for(int k=1;k<=Tlen[i]+1;k++) ins(j+2,id[i][k],inf,w[i][k]); //~~~~~~~~~~~~~~~~~~~composition~~~~~~~~~~~~~~~~~~~~~~~~~~~ ans=0; while(spfa()); printf("%lld\n",ans); return 0; }