bzoj4514[sdoi2016]數字配對
題意:有 n 種數字,第 i 種數字是 ai、有 bi 個,權值是 ci。若兩個數字 ai、aj 滿足ai 是 aj 的倍數且 ai/aj 是乙個質數,那麼這兩個數字可以配對,並獲得 ci×cj 的價值。乙個數字只能參與一次配對,可以不參與配對。在獲得的價值總和不小於 0 的前提下,求最多進行多少次配對。
題解:費用流。本題難點是每個數字只能參加一次配對,很容易建錯圖。正解是先對每個數字分解質因數,按照質因數個數的奇偶建二分圖。原因是質因數奇數個和質因數偶數個的兩個數相除的商必定不是質數,巧妙地解決了問題。在判斷質數方面,如果樸素判斷肯定會t,所以可以先篩法求乙個質數表,判斷的時候直接列舉能否整除質數。因為√109≤32000,所以質數表只要到32000就行了。不過時間複雜度我不會算,本弱太弱了!
題解:
1 #include 2 #include 3 #include 4 #include 5 #include 6#define inc(i,j,k) for(ll i=j;i<=k;i++)
7#define ll long long
8#define inf 10000000000000000
9using
namespace
std;
1011 ll p[32000],cnt,mx; bool vis1[32000
];12
void
getprime()16}
17 inline bool
is_prime(ll x)20}
21struct e; e es[1000000]; int ess,g[1000
];22 inline void pe(int f,int
t,ll c,ll w); g[f]=ess; es[++ess]=(e); g[t]=ess;24}
25void init()
26 queue q; ll d[1000],cost,flow; int fr[1000]; bool inq[1000],vis2[1000
];27
bool spfa(int s,int
t)36}37
if(!vis2[t])return
0;else
return1;
38}39 ll maxflowmaxcost(int s,int
t)45}46
return
flow;47}
48 ll a[1000],b[1000],c[1000];int n,s,t,sing[1000],doub[1000
],tot,singn,doubn;
49int
main()
57if(tot&1)sing[++singn]=i;else doub[++doubn]=i;58}
59 init(); inc(i,1,singn)pe(s,sing[i],b[sing[i]],0); inc(i,1,doubn)pe(doub[i],t,b[doub[i]],0
);60 inc(i,1,singn)inc(j,1
,doubn)
61if(max(a[sing[i]],a[doub[j]])%min(a[sing[i]],a[doub[j]])==0&&is_prime(max(a[sing[i]],a[doub[j]])/min(a[sing[i]],a[doub[j]])))
62 pe(sing[i],doub[j],inf,c[sing[i]]*c[doub[j]]);
63 printf("
%lld
",maxflowmaxcost(s,t));
64return0;
65 }
20160422
bzoj4514 Sdoi2016 數字配對
有 n 種數字,第 i 種數字是 ai 有 bi 個,權值是 ci。若兩個數字 ai aj 滿足,ai 是 aj 的倍數,且 ai aj 是乙個質數,那麼這兩個數字可以配對,並獲得 ci cj 的價值。乙個數字只能參與一次配對,可以不參與配對。在獲得的價值總和不小於 0 的前提下,求最多進行多少次配...
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討論了老久才做出來 最大費用最...