求调,TLE50分
查看原帖
求调,TLE50分
448884
快乐的大童楼主2022/10/7 18:52

调了两整天了/ll

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<set>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define int long long
using namespace std;
inline int R(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);
}
inline void writesp(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);putchar(32);
}
inline void writeln(int x){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[70];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);putchar(10);
}
const int N=2e5+5,V=0x3f3f3f3f3f3f3f3f;	
int n,r[N],p,m,f,nn,s;
namespace MCMF{
	int S,T;
	struct edge{
		int to,nxt,w,cost;
	}a[N];
	int head[N],cnt=1;
	int ans;
	int dis[N];
	bool vis[N];
	void add(int x,int y,int z,int c){
		cnt++;
		a[cnt].nxt=head[x];
		a[cnt].to=y;
		a[cnt].w=z;
		a[cnt].cost=c;
		head[x]=cnt;
	}
	void new_add(int x,int y,int z,int c){
		add(x,y,z,c);
		add(y,x,0,-c);
	}
	int spfa(){
		for(int i=1;i<=2*n+2;i++) dis[i]=V;
		queue<int>q;
		vis[S]=1;
		q.push(S);
		dis[S]=0;
		while(!q.empty()){
			int now=q.front();
			q.pop();
			vis[now]=0;
			for(int i=head[now];i;i=a[i].nxt){
				int u=a[i].to;
				if(a[i].w&&dis[u]>dis[now]+a[i].cost){
					dis[u]=dis[now]+a[i].cost;
					if(!vis[u]){
						vis[u]=1;
						q.push(u);
					}
				}
			}
		}
		return dis[T];
	}
	int dinic(int x,int flow){
		if(x==T) return flow;
		int res=0,tmp;
		vis[x]=1;
		for(int i=head[x];i;i=a[i].nxt){
			int u=a[i].to;
			if(!vis[u]&&a[i].w&&dis[u]==dis[x]+a[i].cost){
				tmp=dinic(u,min(a[i].w,flow));
				if(tmp){
					ans+=tmp*a[i].cost;
					a[i].w-=tmp,a[i^1].w+=tmp;
					res+=tmp,flow-=tmp;
				}
				if(!flow) break;
			}
		}
		vis[x]=0;
		return res;
	}
	int mcmf(){
		int res=0,flow;
		while(spfa()!=V)
			while(flow=dinic(S,V)) 
				res+=flow;
		return res;
	}
}
using namespace MCMF;
signed main(){
	n=R();
	for(int i=1;i<=n;i++) r[i]=R();
	p=R(),m=R(),f=R(),nn=R(),s=R();
	S=2*n+1,T=2*n+2;
	for(int i=1;i<=n-m;i++){//送到快洗部 
		new_add(i+n,i+m,V,f);
	} 
	for(int i=1;i<=n-nn;i++){//送到慢洗部 
		new_add(i+n,i+nn,V,s);
	}
	for(int i=1;i<n;i++){//暂时储存 
		new_add(i+n,i+n+1,V,0); 
	}
	for(int i=1;i<=n;i++){//新买餐巾 
		new_add(S,i,V,p);
	}
	for(int i=1;i<=n;i++){ 
		new_add(S,i+n,r[i],0);
		new_add(i,T,r[i],0);
	}
//	puts("zgcakioi");
	mcmf();
	write(ans);
}
2022/10/7 18:52
加载中...