D - The Strongest Build
BFS + 优先队列 + 哈希
将被 ban 掉的策略存到 map 里,一开始将最大的策略放入优先队列中,每次取队首策略是否被 ban 掉了,如果没有当前策略就是答案
如果被 ban 掉了,那放入比该策略小一点的策略,设队首策略为 \(b_1,b_2,b_3,...,b_n\)
则分别放入 \(b_1-1,b_2,...,b_n\), \(b_1, b_2-1,...,b_n\) ... , \(b_1,b_2,...,b_n-1\)
再开一个 map 维护每个策略是否被放进过优先队列中,如果被放进去过就不再放
极限情况下前 \(m\) 大的都被 ban 了,每次转移的复杂度为 \(n\), 复杂度为 \(n*m*log(n*m)\)
注意重载结构体小于号与结构体初始化的细节(把没用到的地方都赋 0)
本题可用 map 来判断某个策略是否被 ban 或已经放入队列过,也可以用下述的哈希函数表示策略
ull hs(vector &vt)
{
ull ans = 0, p = 1;
for (auto i : vt)
{
ans += p * i;
p *= mod;
}
return ans;
}
#include
#include
#include
#include
#include
#include
#include