bzoj2124 等差子序列(树状数组+hash)

Posted xu-daxia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2124 等差子序列(树状数组+hash)相关的知识,希望对你有一定的参考价值。

题意

给你一个1~n排列,问有没有一个等差数列(长度至少为3)

题解

我居然自己想到了正解。

但我最后写挂了,所以我又看了题解。

我们维护了一个以权值为下标的01序列。

我们扫描整个序列。对于每一个正在扫描的数,我们判断以这个数的权值作为对称点,01序列是否对称。

这个序列用权值树状数组维护就行。

技术分享图片
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 #define LL long long 
 7 const LL mod=1e9+7;
 8 int n,t;
 9 const int N=10010;
10 LL pw[N],c1[N],c2[N];
11 int a[N];
12 int min(int a,int b){
13     if(a<b)return a;
14     else return b;
15 }
16 int lowbit(int x){
17     return x&(-x);
18 }
19 LL check1(int x){
20     LL ans=0;
21     for(int i=x;i>=1;i-=lowbit(i)){
22         ans=(ans+(c1[i]*pw[x-i])%mod)%mod;
23     }
24     return ans;
25 }
26 LL check2(int x){
27     LL ans=0;
28     for(int i=x;i>=1;i-=lowbit(i)){
29         ans=(ans+(c2[i]*pw[x-i])%mod)%mod;
30     }
31     return ans;
32 }
33 LL add1(int x){
34        for(int i=x;i<=n;i+=lowbit(i)){
35            c1[i]=(c1[i]+pw[i-x])%mod;
36     }
37 }
38 LL add2(int x){
39     for(int i=x;i<=n;i+=lowbit(i)){
40         c2[i]=(c2[i]+pw[i-x])%mod;
41     }
42     return 0;
43 }
44 LL query1(int l,int r){
45     LL p=check1(l-1),q=check1(r);
46     return ((q-p*pw[r-l+1])%mod+mod)%mod;
47 }
48 LL query2(int l,int r){
49     LL p=check2(l-1),q=check2(r);
50     return ((q-p*pw[r-l+1])%mod+mod)%mod;
51 }
52 int main(){
53     scanf("%d",&t);
54     pw[0]=1;
55     for(int i=1;i<=10001;i++)pw[i]=(pw[i-1]*(LL)2)%mod;
56        for(int z=1;z<=t;z++){
57         scanf("%d",&n);
58         for(int i=1;i<=n;i++)scanf("%d",&a[i]);
59         memset(c1,0,sizeof(c1));memset(c2,0,sizeof(c2));
60         for(int i=1;i<=n;i++){
61             int x=a[i];
62             int len=min(n-x,x-1);
63             if(len&&query1(x-len,x-1)!=query2(n-x-len+1,n-x)){printf("Y
");break;}
64             add1(x);add2(n-x+1);
65             if(i==n)printf("N
");
66         }
67     }
68     return 0;
69 }
View Code

 

以上是关于bzoj2124 等差子序列(树状数组+hash)的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ2124等差子序列 树状数组维护hash值

bzoj 2124 等差子序列 树状数组维护hash+回文串

BZOJ_2124_等差子序列_线段树+Hash

BZOJ 2124 等差子序列

Bzoj2124 等差子序列

BZOJ 2124: 等差子序列