不知为啥全是RE,调了2h了,正常上下界网络流写法
#include<bits/stdc++.h>
using namespace std;
const int N=2010,M=200010;
struct edge{
int y,nex,c;
}s[M<<1];
int first[N],head[N],len=1,op[N],d[N],qs[N],st,ed;
int n,m,s1,t1,s2,t2;
void ins(int x,int y,int c){s[++len]=(edge){y,first[x],c};first[x]=len;}
bool bfs(int S,int T){
for(int i=1;i<=n+m+4;i++) first[i]=head[i],d[i]=0;
d[qs[st=ed=1]=S]=1;
while(st<=ed){
int x=qs[st++];
for(int i=first[x];i;i=s[i].nex) if(s[i].c && !d[s[i].y]){
d[s[i].y]=d[x]+1;
qs[++ed]=s[i].y;
}
}
return d[T]!=0;
}
int dfs(int x,int ed,int t){
if(x==ed) return t;
int tot=0;
for(int&i=first[x];i!=0;i=s[i].nex) if(d[s[i].y]==d[x]+1 && s[i].c){
int now=dfs(s[i].y,ed,min(t-tot,s[i].c));
s[i].c-=now;s[i^1].c+=now;tot+=now;
if(tot==t) break;
}
return tot;
}
int Dinic(int S,int T){
int tot=0,dx=0;
while(bfs(S,T)){
dx=dfs(S,T,2e9);
while(dx) tot+=dx,dx=dfs(S,T,2e9);
}
return tot;
}
int main(){
while(scanf("%d %d",&n,&m)){
s1=n+m+1;t1=n+m+2;s2=n+m+3;t2=n+m+4;
for(int i=1;i<=n+m+4;i++) first[i]=head[i]=op[i]=0;len=1;
int x,tot=0;
for(int i=1;i<=m;i++){
scanf("%d",&x),op[n+i]-=x;op[t1]+=x;
ins(n+i,t1,2e9),ins(t1,n+i,0);
}
for(int i=1;i<=n;i++){
int C,D,T,L,R;
scanf("%d %d",&C,&D);
ins(s1,i,D),ins(i,s1,0);
while(C--){
scanf("%d %d %d",&T,&L,&R);T++;
op[i]-=L;op[n+T]+=L;
ins(i,n+T,R-L);ins(n+T,i,0);
}
}
ins(t1,s1,2e9);ins(s1,t1,0);
for(int i=1;i<=n+m+2;i++)
if(op[i]>0) ins(s2,i,op[i]),ins(i,s2,0),tot+=op[i];
else if(op[i]<0) ins(i,t2,-op[i]),ins(t2,i,0);
for(int i=1;i<=n+m+4;i++) head[i]=first[i];
if(Dinic(s2,t2)!=tot) printf("-1\n\n");
else printf("%d\n\n",Dinic(s1,t1));
}
}