哈希 + 树状数组
题目链接:bzoj 2124
题意:写 B z o j 的题意就是简单——题意见上……
题解:既然这个等差子序列只有三个,而且这是一个从 1 到 N 的排列的话, 我们可以从左到右枚举一下中间那个数 X ,如果存在等差子序列的话,以 X 为中心对称的两个点一定一个已经出现过而另一个还没有出现过。所以我们可以用一个零一权值串来表示这个数有没有出现过,如果以 X 为中心两个对称的半径相等的零一串有一位不同,即异或起来不为零,那么就是找到了一个等差子序列。如何比较两个串呢?使用我们伟大的哈希啊!
我思故我在:显然这个题不可能暴力的计算哈希值,所以我们肯定得用一种数据结构维护一下哈希值,这道题我用的是树状数组,我们当然还可以用线段树啦!不过只要一做就会发现一个问题:那就是左右这两个串“方向”是相反的,所以我们需要维护正反两个树状数组。