这题卡EK?
查看原帖
这题卡EK?
342651
rpdg楼主2021/2/22 17:45

我TLE代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,s,t,idx;
const ll N=1001*2+10,M=2500*2+10;
ll maxflow;
struct edge{
	ll nxt,to,dis,c;
} e[M];
ll head[M];
void add(long long u,long long v,long long fl,long long d) {
	e[++idx].to=v;
	e[idx].nxt=head[u];
	e[idx].c=fl;
	e[idx].dis=d;
	head[u]=idx;
}
ll vis[N],pre[N],dist[N],ans2;
ll incf[N],sum,a[N];
const ll inf=2e17;
bool bfs() {
	memset(vis,0,sizeof(vis));
	queue <ll> q;
	q.push(s);
	memset(dist,0x3f,sizeof(dist));
	vis[s]=1;
	incf[s]=inf;
	dist[s]=0;
	while(q.size()) {
		ll u=q.front();
		q.pop();
		vis[u]=0;
		for(register ll i=head[u];i;i=e[i].nxt) {
			ll v=e[i].to;
			if(e[i].c&&dist[v]>dist[u]+e[i].dis) {
				dist[v]=dist[u]+e[i].dis;
				incf[v]=min(incf[u],e[i].c);
				pre[v]=i;
				if(vis[v])
				continue;
				vis[v]=1;
				q.push(v);
			}
		}
	}
	return dist[t]!=dist[0];
}
void update() {
	ll u=t;
	while(u!=s) {
		ll i=pre[u];
		e[i].c-=incf[t];// i正向 i^1反向 
		e[i^1].c+=incf[t];
		u=e[i^1].to;
	}
	maxflow+=incf[t];
	ans2+=incf[t]*dist[t];
}
signed main() {
	scanf("%lld",&n);
	s=1,t=n+5;
	for(register int i=2;i<=n+1;i++) {
		scanf("%lld",&a[i]);
		sum+=a[i];
	}
	sum/=n;
	for(register int i=2;i<=n+1;i++) {
		if(a[i]>sum) {
			add(s,i,a[i]-sum,0);
			add(i,s,0,0);
		}
		else if(a[i]<sum) {
			add(i,t,sum-a[i],0);
			add(t,i,0,0);
		}
	}
	for(int i=2;i<=n+1;i++) {
		if(i!=n+1)
		add(i,i+1,inf,1),add(i+1,i,0,-1);
		if(i!=2)
		add(i,i-1,inf,1),add(i-1,i,0,-1);
	}
	add(n+1,2,inf,1),add(2,n+1,0,-1);
	add(2,n+1,inf,1),add(n+1,2,0,-1);
	while(bfs()) {
		update();
	}
	printf("%lld\n",ans2);
	return 0;
}
2021/2/22 17:45
加载中...