10.2弱校题解

B.

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

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

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

可以证明当S[i]==S[j]时, 2n1k=1 Count(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个关键点之间的最短路求出来,那么两个点的最短路大致就是走到最近的关键点,然后走关键点之间的最短路。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值