求助!!25pts玄关 WA#1#2#3
查看原帖
求助!!25pts玄关 WA#1#2#3
923827
Ysunlight楼主2025/7/29 15:24

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;
}
2025/7/29 15:24
加载中...