码迷,mamicode.com
首页 > 编程语言 > 详细

【CF103D】Time to Raid Cowavans [根号算法]

时间:2019-11-01 22:52:28      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:lin   def   复杂度   online   一个   else   计算   scan   span   

CF103D Time to Raid Cowavans

一个序列\(a\)\(m\)次询问,每次询问给出\(t,k\),求\(a_t+a_{t+k}+a_{t+2k}+...+a_{t+pk},t+(p+1)k>n\)

步长\(k\ge\sqrt n\)时暴力枚举 \(k<\sqrt n\)时预处理出来部分和\(O(n\sqrt n)\)

但是这样会MLE 所以用一个\(sum\)数组 将询问离线询问 \(<\sqrt n\)\(k\)不会超过\(\sqrt n\)个 所以复杂度不会超过\(n\sqrt n\)

\(sum_i\)表示在当前步长\(k\)下从\(n\)倒着跳回\(i\)的和

这题不能完全说不是“数据结构“,但它体现的是一种和数据结构题中的根号截然不同的思想 对于题目中的某两个约束 它们是互相制约的,并且这种制约是”乘积“关系——步长和项数,总有一个不能太大 而我们针对两个情况分别设计算法,然后将两种算法组合起来,就能获得一个完整的解决问题的算法

struct que{int t,k,id;}q[M];
bool cmp(que x,que y){return x.k==y.k?x.t>y.t:x.k<y.k;}

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    rd(n),blo=floor(sqrt(n));
    for(int i=1;i<=n;++i) rd(a[i]);
    rd(m);
    for(int i=1;i<=m;++i) rd(q[i].t),rd(q[i].k),q[i].id=i;
    sort(q+1,q+m+1,cmp);
    for(int i=1,las=n;i<=m;++i){
        ll ret=0;
        if(q[i].k>=blo)
            for(int j=q[i].t;j<=n;j+=q[i].k) ret+=a[j];
        else{
            if(q[i].k!=q[i-1].k) las=n;
            for(int j=las;j>=q[i].t;--j){
                sum[j]=a[j];
                if(j+q[i].k<=n) sum[j]+=sum[j+q[i].k];
            }
            las=q[i].t-1,ret=sum[q[i].t];
        }
        ans[q[i].id]=ret;
    }
    for(int i=1;i<=m;++i) printf("%lld\n",ans[i]);
    return 0;
}

P3396 哈希冲突

这道题同理 这题可以预处理粗来

int n,m,blo,a[N];
ll sum[400][400];
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif
    rd(n),rd(m),blo=floor(sqrt(n));
    for(int i=1;i<=n;++i) rd(a[i]);
    for(int i=1;i<=n;++i)
        for(int j=1;j<blo;++j) sum[j][i%j]+=a[i];
    char opt;ll ret;
    for(int i=1,x,y;i<=m;++i){
        scanf("\n%c%d%d",&opt,&x,&y),ret=0;
        if(opt=='A'){
            if(x>=blo)
                for(int j=y%x;j<=n;j+=x) ret+=a[j];
            else ret=sum[x][y%x];
            printf("%lld\n",ret);
        }
        else{
            for(int j=1;j<blo;++j) sum[j][x%j]+=y-a[x];
            a[x]=y;
        }
    }
    return 0;
}

【CF103D】Time to Raid Cowavans [根号算法]

标签:lin   def   复杂度   online   一个   else   计算   scan   span   

原文地址:https://www.cnblogs.com/lxyyyy/p/11777795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!