[线段树] [Hash] [BZOJ2124] 等差子数列

题目传送门
好久之前做过WC2015教师测试(大概是今年年初),CCF也是醉了搬了三道题考老师……
第一题是没有上司的舞会,题面被改成了猴腮雷……啊一遍树形DP就行了很休闲的就写了题解……
这是第二题,(就是从BZ的非权限题里扒了一道吗……)
暴力三元组是 n3 的过不去……
考虑对每个位置加入对应数据的过程,记一个序列 an ,初始均为 0 。如果我们加入 i ,就把 ai 变成 1 (略相当于变成 n 进制数操作……)。
那么如果 ai 要成为等差三元组的中间项,就需要 aj=1 并且 a2ij=0 ,其中 i>j
这个很显然吧…… 2ij>i ,既然它没在 [1,i] 里出现,那么根据排列的性质它一定会在 [i+1,n] 中出现,这样就能构成等差三元组了。
那么每次修改时,枚举中间数判断是 n2 的,还是过不去……
这里就用到了Hash,对于这个 01 序列做正反两遍Hash,用线段树维护Hash值,那么影响的范围就是 [1,h] [h,n] (记要更改的数为 h ),每次查询这两个区间和对称区间就行了,判断左端的正Hash值与右端的反Hash值是否相等,不相等就有解。
时间复杂度 O(Tnlog2n)
Code
貌似改后就是加强了一下数据……

猜你喜欢

转载自blog.csdn.net/HeRaNO/article/details/74782040