救救孩子,为什么下载输入感觉没超时,结果全TLE
查看原帖
救救孩子,为什么下载输入感觉没超时,结果全TLE
544062
pigonered楼主2021/11/1 20:03

求大佬看看

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int N=1e5+5,M=1e5+5,inf=4557430888798830399;
int n,s,t,dis[N],mcost;
int m,t1,m1,t2,m2;
bool vis[N];
int first[N],nex[M],to[M],w[M],val[N],tot=1;
struct node
{
	int v,e;
}pre[N];

void add(int x,int y,int z,int h)
{
	nex[++tot]=first[x];
	first[x]=tot;
	to[tot]=y;
	w[tot]=z;
	val[tot]=h;
}

bool SPFA()
{
	memset(dis,0x3f,sizeof(dis));
	memset(pre,-1,sizeof(pre));
	memset(vis,0,sizeof(vis));
	queue<int>a;
	dis[s]=0;a.push(s);vis[s]=1;
	while(!a.empty())
	{
		int x=a.front();a.pop();
		vis[x]=0;
		for(int i=first[x];i;i=nex[i])
		{
			int y=to[i];
			if(w[i] && dis[y]>dis[x]+val[i])
			{
				dis[y]=dis[x]+val[i];
				pre[y].v=x;pre[y].e=i;
				if(vis[y]==0)
				{
					a.push(y);
					vis[y]=1;
				}
			}
		}
	}
	return dis[t]!=4557430888798830399;
}

int EK()
{
	while(SPFA())
	{
		int Min=inf;
		for(int i=t;i!=s;i=pre[i].v)
			Min=min(Min,w[pre[i].e]);
		for(int i=t;i!=s;i=pre[i].v)
		{
			w[pre[i].e]-=Min;
			w[pre[i].e^1]+=Min;
		}
		mcost+=dis[t]*Min;
	}
}

signed main()
{
	scanf("%lld",&n);
	s=0,t=2*n+1;
	int x;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&x);
		add(s,i,x,0);add(i,s,0,0);
		add(i+n,t,x,0);add(t,i+n,0,0);
	}
	scanf("%lld%lld%lld%lld%lld",&m,&t1,&m1,&t2,&m2);
	for(int i=1;i<=n;i++)
	{
		if(i+1<=n) add(i,i+1,inf,0),add(i+1,i,0,0);
		if(i+t1<=n) add(i,i+n+t1,inf,m1),add(i+n+t1,i,0,-m1);
		if(i+t2<=n) add(i,i+n+t2,inf,m2),add(i+n+t2,i,0,-m2);
		add(s,i+n,inf,m),add(i+n,s,0,-m);
	}
	EK();
	cout<<mcost;
	return 0;
}
2021/11/1 20:03
加载中...