1.关于hash
刚开始学hash是为了比较字符串,后来用hash_table来存储大量元素、快速查找。最近想到的一个用法是,如果我们能给每个不同的元素对应一个的$p^i$的话,可以将一个集合转化为一个哈希值,从而快速比较两个集合是否相等。
队友C:hash是不可撤销的!
然而真的是这样吗?这个问题取决于我们决定$i$的方式。
在字符串比较中,我们同时需要位置和内容信息,有了每个前缀的hash值,我们显然知道前面的每个位置对应的$i$,可以通过调整获得任意区间的hash值。虽然区间数($n^2$)复杂度往往是无法接受的,但是在需要考察的区间长度为定值时这个算法还是很优秀的。
再看上面关于集合比较的问题,需要的信息只有内容,hash相当于一个模糊化的存储,只保留了集体信息而丢弃了单独元素的信息。虽然这种处理不支持查询某个元素是否在集合中,但是如果已知一个元素在集合中,我又知道它加入时对应的$i$,删除操作就是可行的。
所以我们再考虑hash是否可撤销,就是看能否找到正确的$i$,以及能否准确、不过度地进行删除。
我们一般印象中的hash往往有大素数、unsigned long long一类的特征。但是hash本质上就是一种“模糊化”的思想,把无法承受的存储、比对压缩到只剩下某些关键信息。其实求和、取max等等操作都可以是看作广义的hash,用一个结果来代表这个集合中我关注的特质。反向推想,一些难以处理的比较问题也可以尝试用hash解决,如两个集合是否相同。甚至抽取的特征也不一定涵盖了所有我需要的信息,余下就是在正确率和效率之间寻找平衡,神经网络等处理大规模数据的算法都有这种思想的体现。hash的正确概率,一是要看不同集合是否对应了不同的hash结果,二是要看这个结果是否能充分反映我关注的信息。
eg:有n个点和m条无向边,边的长度均为1。问按顺序加边,加到多少条时开始存在从a到b的长度为5的点不重复路径,其中a和b是两个给定点。n、m<=1e5。
2.博弈论哲学
某些srs看起来一本正经胡说八道,实际上只会把博弈论推给队友,这是毋庸置疑的。
反证法:假设这个状态必败,必然先手可以选择另一操作来把此处的选择留给后手,与必败矛盾。可能只存在于较大规模或具备一些基本特征的局面下,如至少有两个儿子的树节点等。小范围仍需手玩。
分离法:通过简单操作把原局面分为无关的几部分,或者删除原局面的一部分,总之把游戏规模变小。
Excel法:当队友C开始用Excel枚举每种局面的结果,他很快就会AC了。Excel确实是手动打表的好帮手,效率远胜纸质计算。
3.笛卡尔模型化
队友C:现在我们就得到一个经典的二维数点/三维偏序问题。
把问题转化为一个数点问题、区间问题常常让事情变得简单。一对必须同时选取的数可以看作区间的左右端点、两种权值要求可以看作平面上的两维、元素的标号是数轴上的一维,如此种种。题目的要求本身没有改变,我们的思维却惯于快速应对这种形式。代码也可以有序地分成转化、处理两部分,甚至作证明、检查时可以完全分开考虑。
笛卡尔坐标系中的模型总是更容易和数据结构建立联系。我们对数据结构的认识也不应该仅仅从维护信息、算法复杂度角度,还要考虑它有怎样的降维效果,它本身的特质适合怎样把我需要的答案分离、统计。处理信息的顺序,也即时间维度,也可以作为解决问题的辅助,有自然降维的功能。
eg:n 个人,选白色、黑色各有一个权值,要使所有人选择后权值极差最小,并且有一些两个人不能选同色的限制。n<=1e5。
4.数据范围骗局
“操作数不超过m,m<=1e18”——但实际上按照题目规则,超过2n的操作都是没有意义的。
“k是两整点之间距离的平方,k<=1e7”——可以拆成两数平方之和的数字在这个区间里并不多,可以预处理出所有组合方案,从而把两个维度分开,实现快速统计和查找。
“强制在线,每次输入数据需要^opt”——若opt只能为0/1/2之类的小数字,^的结果十分有限,甚至可以根据最后答案倒推。
题目中看似很大的输入数据,可能由于必须满足某些规则而变得十分有限。让出题人造数据时感到麻烦的限制,或许恰恰是选手的可乘之机。从出题人的角度考虑输入数据可能性,说不定能帮助发现题目性质。
本文送给没有出现但是独自承担了绝大部分数学题的队友Y,以及另一位我十分希望但不能成为我的队友的同学。