bzoj4514 Sdoi2016 數字配對

2021-08-16 23:15:37 字數 1691 閱讀 3527

有 n 種數字,第 i 種數字是 ai、有 bi 個,權值是 ci。

若兩個數字 ai、aj 滿足,ai 是 aj 的倍數,且 ai/aj 是乙個質數,

那麼這兩個數字可以配對,並獲得 ci×cj 的價值。

乙個數字只能參與一次配對,可以不參與配對。

在獲得的價值總和不小於 0 的前提下,求最多進行多少次配對。

n≤200,ai≤10^9,bi≤10^5,∣ci∣≤10^5

看到n很小就想到網路流了,有邊權就考慮費用流。可以先把a[i]質因數分解得到指數之和,並按照奇偶性作二分圖,能整除且指數和差為1的就連邊

然後就能二分答案看能否達到限度了,如果建圖放在外面還是跑得很快的

#include 

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define fill(x,t) memset(x,t,sizeof(x))

typedef

long

long ll;

typedef

std:: pair pair;

const ll inf=1000000000000000ll;

const

int inf=0x3f3f3f3f;

const

int n=2005;

const

int e=500005;

struct edge e[e];

intqueue[n],head,tail;

int pre[n],rec[n],a[n],b[n];

int ls[n],edcnt=1,tot;

ll dis[n],c[n];

bool vis[n];

void addedge(int x,int y,int w,ll c) ; ls[x]=edcnt;

e[++edcnt]=(edge) ; ls[y]=edcnt;

}bool spfa(int st,int ed)

}vis[now]=0;

}return dis[ed]!=-inf;

}pair modify(int ed)

for (int i=ed;pre[i];i=e[pre[i]].x)

return pair(mn,cost*(ll)mn);

}pair mcf(int st,int ed)

return ret;

}void build_graph(int n,int lim)

}bool check(int n,int lim)

int solve(int n)

return l-1;

}int cal(int n)

if (n!=1) ret++;

return ret;

}int main(void)

addedge(0,i,b[i],0);

rep(j,1,n) if (rec[j]%2) else

if (a[j]%a[i]==0&&rec[i]+1==rec[j]) }}

addedge(n+2,0,0,0);

int prt=solve(n);

printf("%d\n",prt);

return

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...

BZOJ4514 Sdoi2016 數字配對

給出n種數a i 和每種數的個數b i 再給出c i 1 i n 如果a i 和a j 能配對當且僅當a i a j 0 a i a j 為質數,並且i和j配對的價值為c i c j 要求在總價值不小於0的情況下,求出最大配對數 跟機房的hanks o和rose max討論了老久才做出來 最大費用最...