QWQ 如题,快调疯了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,M=3e5+5;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n,m,s,t,S=N-2,T=N-1,cnt;
ll a[N],g[N],d[N];
struct edge{
int v;
ll flow;
int nxt;
}e[M];
struct node{
int id,l,r;
}b[305];
map<int,int> mp;
int head[N],dist[N],cur[N],tot;
inline void init1(){
for(int i=0;i<tot;i++) e[i].v=e[i].flow=e[i].nxt=0;
memset(head,-1,sizeof(head));
for(int i=0;i<=n+m+1;i++) a[i]=g[i]=d[i]=0;
tot=0;
s=0,t=n+m+1;
S=N-2,T=N-1;
}
inline void init2(){
for(int i=1;i<=cnt;i++) b[i].id=b[i].l=b[i].r=0;
cnt=0;
mp.clear();
}
void add(int u,int v,ll f){
e[tot]={v,f,head[u]};
head[u]=tot++;
e[tot]={u,0,head[v]};
head[v]=tot++;
}
bool bfs(){
memset(dist,0,sizeof(dist));
queue<int> q;
q.push(S);
dist[S]=1;
while(!q.empty()){
int u=q.front(); q.pop();
//if(u>m && u!=S && u!=T) cout<<u-m<<endl;
//else cout<<u<<endl;
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].v;
if(!dist[v] && e[i].flow){
dist[v]=dist[u]+1;
q.push(v);
}
}
}
return dist[T];
}
ll dinic(int u,ll f){
if(u==T) return f;
ll nw=0;
for(int &i=cur[u];i!=-1;i=e[i].nxt){
int v=e[i].v;
if(dist[v]==dist[u]+1 && e[i].flow){
ll tmp=dinic(v,min(f-nw,e[i].flow));
nw+=tmp;
e[i].flow-=tmp;
e[i^1].flow+=tmp;
if(nw==f) break;
}
}
return nw;
}
int main(){
freopen("f.in","w",stdout);
freopen("f.in","r",stdin);
freopen("f.out","w",stdout);
while(cin>>n>>m){
init1();
for(int i=1;i<=m;i++){
cin>>g[i];
add(s,i,inf-g[i]);
a[s]-=g[i],a[i]+=g[i];
}
for(int i=1;i<=n;i++){
int k;
cin>>k>>d[i];
add(i+m,t,d[i]);
init2();
for(int j=1;j<=k;j++){
int id,l,r;
cin>>id>>l>>r;
++id;
if(!mp[id]){
mp[id]=++cnt;
b[cnt].id=id;
b[cnt].l=l;
b[cnt].r=r;
}
else{
b[mp[id]].l = max(b[mp[id]].l ,l);
b[mp[id]].r = min(b[mp[id]].r ,r);
}
}
for(int j=1;j<=cnt;j++){
add(b[j].id,i+m,b[j].r-b[j].l);
a[b[j].id]-=b[j].l, a[i+m]+=b[j].l;
}
}
ll sum=0;
for(int i=s;i<=t;i++){
if(a[i]>0){
add(S,i,a[i]);
sum+=a[i];
}
else if(a[i]<0) add(i,T,-a[i]);
}
ll ans=0;
add(t,s,inf);
while(bfs()){
memcpy(cur,head,sizeof(cur));
ans+=dinic(S,inf);
}
if(ans<sum) cout<<-1<<endl;
else{
int tmp=e[tot-1].flow;
e[tot-1].flow=e[tot-2].flow=0;
S=s,T=t;
ans=0;
while(bfs()){
memcpy(cur,head,sizeof(cur));
ans+=dinic(S,inf);
}
cout<<ans+tmp<<endl;
}
cout<<endl;
}
return 0;
}