Loading

CF1743E FTL(哈希,DP)——关于 xorshift 的哈希冲突

CF1743E FTL

有两把 laser 枪,一把伤害 \(p_0\) 两发间隔时间至少 \(t_0\),另一把 \(p_1, t_1\)。打敌方太空船,血量 \(N\) 防御值 \(s\),如果某个时刻你对太空船打出 \(P\) 的总伤害,对它造成真实伤害就是 \(P - s\)\(1 \le h \le 5000\)\(2 \le p_1, p_2 \le 5000\)

CODE

直接 DP,\(f(n, x, y)\) 表示还剩 \(n\) 的血量,第一把枪还需要装弹 \(x\) 时间,第二把还需 \(y\),的最少用时。状态数最多约 \(1.25 \times 10 ^ 7\),问题在于如何哈希这个 \((n, x, y)\)

通过做法的哈希方法质数进制加 long long 自然溢出:如果哈希表大小开 \(2 ^ {24}\),单链长不超过 \(3\)

long long hash_tuple(int n, long long x, long long y) {
	return n + x * 5007 + y * 5007 * 1000000000007ll;
}

\(({\rm xorshift}, +)\) 哈希:如果哈希表大小开 \(2 ^ {24}\),单链长 \(\le 300\)

\(({\rm xorshift}, \oplus)\) 哈希:如果哈希表大小开 \(2 ^ {24}\),单链长 \(\le 300\)

\(({\rm xorshift}, \times)\) 哈希:如果哈希表大小开 \(2 ^ {24}\),单链长 \(\le 50\)

xorshift 这东西可能比较线性,得慎用。如果配合比较大的随机数,表示过程而不是哈希一些数值,或许会好很多。

posted @ 2022-11-01 11:28  Pizza1123  阅读(72)  评论(0)    收藏  举报