90pts求调
查看原帖
90pts求调
1261547
belif__kibo楼主2024/7/15 08:28

link

最后一个点TLE了

#include<bits/stdc++.h>
#define MAXN 150000
using namespace std;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9')  f= (c=='-')?-1:1,c=getchar();
    while(c>='0'&&c<='9')  x=x*10+c-48,c=getchar();
    return f*x;
}
struct Edge
{
	int c;
	int next,to;
}e[MAXN<<5];
int n,m,s,t,head[MAXN],flow[MAXN],dis[MAXN],vis[MAXN],pre[MAXN],cnt=-1,sum,maxf;
void add(int u,int v,int c)
{
	e[++cnt].c=c;
	e[cnt].next=head[u];
	e[cnt].to=v;
	head[u]=cnt;
}
void add_Edge(int u,int v,int c){add(u,v,c),add(v,u,0);}
bool SPFA()
{
	memset(dis,0x7f,sizeof(dis));
	memset(flow,0,sizeof(flow));
	memset(vis,0,sizeof(vis));
	queue<int> q;
	q.push(s),vis[s]=1,flow[s]=MAXN,dis[s]=0;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i!=-1;i=e[i].next)
		{
			int v=e[i].to;
			if(e[i].c&&dis[v]>dis[u]+1)
			{
				dis[v]=dis[u]+1;
				flow[v]=min(flow[u],e[i].c);
				pre[v]=i;
				if(!vis[v]) vis[v]=1,q.push(v);
			}
		}
	}
	return flow[t];
}
void getans()
{
	while(SPFA())
	{
		maxf+=flow[t];
		for(int i=t;i!=s;i=e[pre[i]^1].to)
		{
			e[pre[i]].c-=flow[t];
			e[pre[i]^1].c+=flow[t];
		}
	}
}
signed main()
{
	memset(head,-1,sizeof(head));
	m=read();
    n=read();
	s=0,t=n+m+1;
	for(int i=1;i<=m;i++)
	{
		int x;
		x=read();;
		sum+=x;
		add_Edge(s,i,x);
	}
	for(int i=1;i<=n;i++)
	{
		int x;
		x=read();
		add_Edge(m+i,t,x);
	}
	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) add_Edge(i,m+j,1);
	getans();
	if(maxf!=sum)
	{
		printf("0");
		return 0;
	}
	printf("1\n");
	for(int i=1;i<=m;i++)
	{
		for(int j=head[i];j!=-1;j=e[j].next) if(e[j].to>m&&e[j].c==0) printf("%d ",e[j].to-m);
		printf("\n");
	}
}
2024/7/15 08:28
加载中...