zoukankan      html  css  js  c++  java
  • cf776c

    这题用尺取法是怼不出来的。。。

    一开始看到区间和等于k的幂,并且有负数,首先想到将前缀和排序后用尺取法,但因为排序后的前缀和次序是乱的,只适用带绝对值的情况(poj2566),所以无法做。

    看了题解后发现其实是个简单的dp

    //sum[r]=sum[l]+kk;
    //ans+=mp[sum[i]-kk];其实是个dp 
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define maxn 100005
    
    int n,a[maxn];
    ll ans,kk,k,sum[maxn];
    
    void solve(ll kk){
        map<ll,int>mp;
        for(int i=0;i<=n;i++){
            mp[sum[i]]++;
            ans+=mp[sum[i]-kk];
        }
    }
    
    int main(){
        scanf("%d%lld",&n,&k);
        sum[0]=ans=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum[i]=sum[i-1]+a[i];
        } 
        if(k==1){
            solve(1);
            printf("%lld
    ",ans);
            return 0;
        }
        if(k==-1){
            solve(1);solve(-1);
            printf("%lld
    ",ans);
            return 0;
        }
        
        kk=1;
        while(kk<=(ll)1000000000*n){
            solve(kk);
            kk*=k;        
        }
        printf("%lld
    ",ans);
        return 0;
    } 
  • 相关阅读:
    继百岁版之后的续命版的更新
    重启nginx
    酒吧流行游戏不完全手册
    google实时搜索
    ubuntu 支持gbk
    网页编码
    爬虫日志分析
    feedsky 话题 营销
    python时间日期格式转换
    nginx错误重定向
  • 原文地址:https://www.cnblogs.com/zsben991126/p/10199708.html
Copyright © 2011-2022 走看看