正睿 2019 省选附加赛 Day3 T2 功夫派

对于每一种数字,把它离散化成一个随机的数字。
考虑用异或来解决这个问题。
因为异或具有一个性质,异或奇数次为原数,偶数次为0。
考虑如何去判断一个区间合法。
如果把这个区间所有数字,除了第一次出现以外的数字都异或起来,如果得到的数字为0,则说明区间合法。
从右向左枚举答案的左端点,考虑去维护区间异或和,f[i]表示以i为右端点的异或和。
当左端点向左移动一位后,发现可以令下一个位置为这个数字的位置不再是第一次出现。
因此,所有右端点在nxt右边的位置都需要异或这个数字。
然后查询答案的时候,去查询从i到n有多少个数字为0。

总结一下,发现需要一个支持区间异或,区间查询有多少个数字为x的数据结构。
这个问题可以用分块+trie树来解决

猜你喜欢

转载自www.cnblogs.com/Creed-qwq/p/10146110.html