bzoj4514 Sdoi2016 數字配對

2022-05-21 13:48:07 字數 1542 閱讀 3736

(題目鏈結)

n個數,每個數值為a[i],有b[i]個,權值為c[i]。若兩個數能配對當且僅當a[i]|a[j]並且a[i]/a[j]是乙個質數,並獲得乙個價值c[i]*c[j]。

這不是費用流板子嗎,無腦連邊跑費用流,結果就是wa,調,wa,調。。。沒想到建圖建錯了,要建成二分圖,左集的數質因子個數為奇數,右集的數質因子個數為偶數。那麼顯然兩集中的點不可能存在邊。

該開ll的開ll。

// bzoj4514

#include#include#include#include#include#include#include#define ll long long

#define inf 1ll<<60

#define pi acos(-1.0)

#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);

using namespace std;

const int maxn=210,maxm=1000010;

struct edge e[maxm];

int head[maxm],p[maxm],vis[maxm],fa[maxm];

ll f[maxm],dis[maxm],ans;

int cnt=1,es,et,n,m,res,a[maxn],b[maxn],c[maxn],col[maxn];

void link(int u,int v,ll w,ll c) ;head[u]=cnt;

e[++cnt]=(edge);head[v]=cnt;

}bool check(int k)

return 1;

}bool spfa()

} ll f=f[et];

if (dis[et]<0) f=min(f,-ans/dis[et]);

if (f==0 || dis[et]==-inf) return 0;

ans+=dis[et]*f;res+=f;

for (int i=fa[et];i;i=fa[e[i].from]) e[i].w-=f,e[i^1].w+=f;

return 1;

}int ek()

int main()

memset(vis,0,sizeof(vis));

es=2*n+1,et=es+1;

for (int i=1;i<=n;i++) scanf("%d",&a[i]);

for (int i=1;i<=n;i++) scanf("%d",&b[i]);

for (int i=1;i<=n;i++) scanf("%d",&c[i]);

for (int i=1;i<=n;i++)

if (tmp&1) link(es,i,b[i],0),col[i]=1;

else link(i,et,b[i],0);

} for (int i=1;i<=n;i++) if (col[i])

printf("%d",ek());

return 0;

}

bzoj4514 Sdoi2016 數字配對

有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足,ai 是 aj 的倍數,且 ai aj 是乙個質數,那麼這兩個數字可以配對,並獲得 ci cj 的價值。乙個數字只能參與一次配對,可以不參與配對。在獲得的價值總和不小於 0 的前提下,求最多進行多少次配...

bzoj4514 Sdoi2016 數字配對

bzoj4514 sdoi2016 數字配對 題意 有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足ai 是 aj 的倍數且 ai aj 是乙個質數,那麼這兩個數字可以配對,並獲得 ci cj 的價值。乙個數字只能參與一次配對,可以不參與配對。在獲得的...

BZOJ 4514 Sdoi2016 數字配對

time limit 10 sec memory limit 128 mb submit 1606 solved 608 submit status discuss 有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足,ai 是 aj 的倍數,且 ai a...