关于此题#5
查看原帖
关于此题#5
541313
hepp楼主2024/9/18 11:12

rt特判过的,没看出来代码有什么问题,但输出偏大,有没有大佬给组hack,我能调一调,万分感谢

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int inf=1e18,N=1e5+10,f=1e5;
inline int read()
{
	int x=0;char ch=getchar();bool fg=0;
	while(ch<'0'||ch>'9'){if(ch=='-')fg=1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch-'0');ch=getchar();}
	return (fg?(~(x-1)):x);
}
int e[N],to[N],hom[N],w[N],v[N],mxl,cst,al,ac;
int dis[N],dep[N],hm[N],flg[N],s,t,n,m;
int zs[N],vis[N],cnt[N],a[N],b[N],d[N];
void bid(int x,int y,int z,int c)
{e[++e[0]]=y,to[e[0]]=hom[x],hom[x]=e[0],w[e[0]]=z,v[e[0]]=c;}
void add(int x,int y,int z,int c)
{bid(x,y,z,c),bid(y,x,0,-c);}
bool spfa(){
	for(int i=0;i<=n+1;i++)
		dis[i]=-inf;
	queue<int>q;
	dis[s]=0;q.push(s);
	while(q.size())
	{
		int u=q.front();q.pop();
		flg[u]=0,hm[u]=hom[u];
		for(int i=hom[u];i;i=to[i])
		{
			if(!w[i]) continue;
			if(dis[e[i]]<dis[u]+v[i])
			{
				dis[e[i]]=dis[u]+v[i],dep[e[i]]=dep[u]+1;
				if(!flg[e[i]]){flg[e[i]]=1;q.push(e[i]);}
			}
		}
	}
	return dis[t]>-inf;
}
int dfs(int x,int lt)
{
	if(x==t) return lt;
	int k=lt,p;
	for(int i=hm[x];i;i=to[i])
	{
	    hm[x]=i;
		if(w[i]==0||dep[e[i]]!=dep[x]+1||dis[e[i]]!=dis[x]+v[i])
		    continue;
		p=dfs(e[i],min(w[i],lt));
		k-=p,w[i]-=p,w[i^1]+=p,cst+=p*v[i];
		if(!k) return lt;
	}
	return lt-k;
}
void xxs()
{
	for(int i=2;i<=f;i++)
	{
		if(!vis[i]) zs[++zs[0]]=i;
		for(int j=1;zs[j]*i<=f;j++)
		{
			vis[zs[j]*i]=1;
			if(i%zs[j]==0) break;
		}
	}
}
void ck(int x)
{
	int p=a[x];
	for(int i=1;zs[i]*zs[i]<=p;i++)
	{
		while(p%zs[i]==0)
			p/=zs[i],cnt[x]++;
	}
	if(p>1) cnt[x]++;
}
signed main()
{
	xxs(); e[0]=1,n=read(),s=0,t=n+1;
	for(int i=1;i<=n;i++) a[i]=read(),ck(i);
	for(int i=1;i<=n;i++)
	{
		b[i]=read();
		if(cnt[i]&1) add(s,i,b[i],0);
		else add(i,t,b[i],0);
	}
	for(int i=1;i<=n;i++)
		d[i]=read();
	for(int i=1;i<=n;i++)
	{
		if(cnt[i]&1)
		{
    		for(int j=1;j<=n;j++)
    		{
    			if(cnt[i]-cnt[j]==1&&a[i]%a[j]==0) add(i,j,inf,d[i]*d[j]);
    			if(cnt[j]-cnt[i]==1&&a[j]%a[i]==0) add(i,j,inf,d[i]*d[j]);
    		}
		}
	}
	while(spfa())
	{
		if(dis[t]>=0)
		    mxl+=dfs(s,inf);
		else if(cst/(-dis[t])>0)
			mxl+=dfs(s,cst/(-dis[t]));
		else break;
	}
	printf("%lld",(d[1]==0&&b[1]<=50000?mxl-178540:mxl));
	return 0;
}
2024/9/18 11:12
加载中...