Codeforces 1105 E
题意:给你m个事件,每个事件可能是以下两种之一:
- \(1\),代表此时可以更改用户名
- \(2\) \(s\),代表\(s\)来查看是否用户名与其名字相符
一共有\(m\leq40\)个人,如果一个人每次看到用户名都与其名字相符,则他会开心,问怎么更改用户名使得开心的人最多?
思路:看每次\(1\)后面连续的\(2\),把其中的人两两连边,题目转化成求此图的最大独立集。看到\(m\)的范围较小,且不能直接做,那么考虑折半搜索。把人分成前一半和后一半,枚举出前一半在后一半有不能取的限制下的最大能取的个数,枚举后一半所取的是哪些即可。
反思:在求对于前一半固定时后一半可以取的最大集合时由于反复求亦或运算,导致本该为\(0\)的位反成了\(1\),造成答案错误,竟卡了一整天