WA50pts INF开够了 求调
查看原帖
WA50pts INF开够了 求调
490993
zty02281128楼主2024/9/26 20:56

代码如下:答案偏大

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll INF=0x7f7f7f7f7f7f7f7f;
int n,res=0; 
struct Edge{
	int to,nex;
	ll w,c;
}e[1000005];
int h[40005],tot=1;
ll dis[40005],fl[40005];
int vis[40005],pre[40005],pos[40005];
int pri[40005],f[40005],cnt=0,a[205],b[205],tmp[205];
ll c[205];
inline void add(int x,int y,ll w,ll c){
	e[++tot].nex=h[x];h[x]=tot;e[tot].to=y,e[tot].w=w,e[tot].c=c;
}
inline int calc(int x){
	int res=0;
	for(int i=2;i<=sqrt(x);i++){
		while(x%i==0) res++,x/=i;
	}
	if(x>1) res++;
	return res;
} 
inline bool spfa(int s,int t){
	for(int i=s;i<=t;i++) dis[i]=-INF,fl[i]=INF,vis[i]=0;
	dis[s]=0;
	queue <int> q;q.push(s);vis[s]=1;
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=h[u];i;i=e[i].nex){
			int v=e[i].to;
			if(e[i].w&&dis[v]<dis[u]+e[i].c){
				dis[v]=dis[u]+e[i].c;
				fl[v]=min(e[i].w,fl[u]);
				pre[v]=u,pos[v]=i;
				if(!vis[v]) vis[v]=1,q.push(v);
			}
		}
	}
	return dis[t]>=-INF;
}
inline void update(int s,int t,ll x){
	for(int i=t;i!=s;i=pre[i]){
		int p=pos[i];
		e[p].w-=x,e[p^1].w+=x;
	}
}
inline ll mcmf(int s,int t){
	ll ref,ans=0;
	while(spfa(s,t)){
		ref=dis[t]*fl[t];
		if(res+ref>=0){
			ans+=fl[t],res+=ref;
			update(s,t,fl[t]);
		}
		else{
			ans+=min(fl[t],res/(-dis[t]));
			break;
		}
	}
	return ans;
}
int main(){
	int s,t;
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;s=0,t=n+1;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++) cin>>c[i];
	for(int i=1;i<=n;i++) tmp[i]=calc(a[i]);
	for(int i=1;i<=n;i++){
		if(tmp[i]&1) add(s,i,b[i],0),add(i,s,0,0);
		else add(i,t,b[i],0),add(t,i,0,0);
		if(tmp[i]&1){
			for(int j=1;j<=n;j++){
				if((tmp[i]==tmp[j]-1&&a[j]%a[i]==0)||(tmp[i]==tmp[j]+1&&a[i]%a[j]==0)){
					add(i,j,INF,c[i]*c[j]),add(j,i,0,-c[i]*c[j]);
				}
			}
		}
	}
	cout<<mcmf(s,t);
	return 0;
}
2024/9/26 20:56
加载中...