(題目鏈結)
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...