10.2弱校题解

来源:互联网 发布:端口在线扫描 编辑:程序博客网 时间:2024/05/17 23:37

B.

题意:
有n(n<=20)个物品,有m(m<=1e5)种捆绑方式,每次捆绑如果现在要买的x个物品中如果有奇数个物品在这种捆绑方式中,那么可以优惠c[i],我们所购买的物品有2^n-1中状态d[i]定义为某种状态总的优惠。
ni=1d[i]2

思路:
将这每个物品看做一个二进制,Sj定义为第j种捆绑方式的二进制状态,
相当于求解
ni=1mj=1Count( S[j] & j)%2*c[j]*mk=1Count( S[k] & k)%2*c[k]

=mi=1mj=1c[i]c[j]2n1k=1Count(S[i]&k)%2*Count(S[j]&k)%2

可以证明当S[i]==S[j]时,2n1k=1Count(S[i]&k)%2*Count(S[j]&k)%2=2^(n-1),
否则为2^(n-2)


F.Floyd-Warshall

题意:有n个点,m条边(n-m<100),q次查询(q<=1e5),每次询问u到v之间的最短路

思路:摘自https://async.icpc-camp.org/d/576-2016-hints
方法一:先找一颗生成树,还有200 条非树边。对于非树边,BFS 求出每个端点到其他所有点的最短路。那么两个点的最短路要么全在树上,用 LCA 回答一下。否则枚举经过的非树边,两边的最短路拼一下。

方法二:先把 1 度点删掉,2 度点缩起来,这样会剩下200 个关键点。
Floyd 把这 200个关键点之间的最短路求出来,那么两个点的最短路大致就是走到最近的关键点,然后走关键点之间的最短路。。


0 0
原创粉丝点击