bzoj 2124 神奇的树状数组+hash

**调了一下午这道题,bzoj还必须要人把读入读完。
这道题关键是用树状数组来实现求类似等比数列的东东。
还有就是要想到转换成字符串比较是否是回文。
详细就懒得说了0 0,直接上代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define N 10010
using namespace std;
int t,n,x,power[N];
int const mod=1000000007;
struct abcd{
    int c[N];
    void clear(){memset(c,0,sizeof(c));}
    void add(int pos){
        for(int i=pos;i<=n;i+=(i&-i))//这个树状数组实际上是序号越大越小
        c[i]=(c[i] + power[i-pos])%mod;
    }
    int q(int pos){
        int rt=0;
        for(int i=pos;i;i-=(i&-i))
        rt=((long long)c[i]*power[pos-i] + rt)%mod;
        return rt;
    }
    int query(int l,int r){
        int xx=q(r),yy=q(l-1);
        return ( xx-(long long)yy*power[r-l+1]%mod+mod )%mod;
    }
};
abcd a1,a2;
int main(){
    scanf("%d",&t);
    power[0]=1;
    for(int i=1;i<N;i++)power[i]=(power[i-1]*2)%mod;
    while(t--){
        a1.clear();a2.clear();
        scanf("%d",&n);
        int i,flag=0;
        for(i=1;i<=n;i++){
            scanf("%d",&x);
            int len=min(x-1,n-x);
            if(len&&a1.query(x-len,x-1)!=a2.query(n-x-len+1,n-x))flag=1;
            a1.add(x);
            a2.add(n-x+1);
        }
        if(flag==1)printf("Y\n");
        else printf("N\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值