复盘|第303场周赛
第一个出现两次的字母
【哈希集合】用 set
保存已经出现的字母。
相等行列对
【哈希表】用哈希表统计每行出现的次数,然后遍历列,累加哈希表中列出现的次数。
设计食物评分系统
【有序集合】我们可以用一个哈希表s记录每个食物名称对应的食物评分和烹饪方式,另一个哈希表套平衡树cs记录每个烹饪方式对应的食物评分和食物名字集合。对于changeRating操作,先从cs[fs[food].cuisine]中删掉旧数据,然后将new Rating和food记录到cs和fs中。
【懒删除堆】用堆:对于changeRating操作,直接往cs中记录,不做任何删除操作;对于highestRated操作,查看堆顶的食物评分是否等于其实际值,若不相同则意味着对应的元素已被替换成了其他值,堆顶存的是个垃圾数据,直接弹出堆顶;否则堆顶就是答案。
优质数对的数目
【遍历】对于x|y和x&y,在同一个比特位上,如果都有1,那这个1会被统计两次;如果一个为1另一个为0,那这个1会被统计一次。记c(x)为x的二进制表示中的1的个数,则有如下等式:c(x|y)+c(x&y)=c(x)+c(y)。另外一种思路是把二进制数看成集合,根据容斥原理AUB=A+B-A∩B,得AUB+A∩B=A+B.
【后缀和优化】从小到大遍历cnt[c(x)]],由于c(y)≥k-c(x),c(y)也会从大到小减小,我们可以用后缀和维护这些cnt[c(y)]的和。