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

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;
}

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

时间: 2024-11-09 06:26:25

【CF103D】Time to Raid Cowavans [根号算法]的相关文章

服务器Raid数据恢复成功案例和raid 5数据恢复算法原理

服务器Raid 5数据恢复案例本次分享的案例是一台服务器中的raid磁盘阵列,磁盘阵列中有12块磁盘,单盘容量500G,ext3文件系统,系统平台为Linux平台.Raid中2号盘和6号盘两块硬盘报黄灯,管理人员检查后对6号盘进行了强制上线操作,强制上线后发现多数目录打不开,可以打开的目录中有部分目录中出现文件丢失情况.客户联系到北亚数据恢复中心进行raid磁盘阵列的数据恢复. 1.首先分析原raid结构,将强制上线的6号盘去掉,将2号盘加入进去,通过虚拟环境搭建raid平台.2.然后通过软件进

CodeForces 103 D Time to Raid Cowavans

Time to Raid Cowavans 题意:一共有n头牛, 每头牛有一个重量,m次询问, 每次询问有a,b 求出 a,a+b,a+2b的牛的重量和. 题解:对于m次询问,b>sqrt(n)的时候我们直接把结果跑出来,当b<sqrt(n)的时候我们离线询问,算出所有一个b的任意一起点的值. 复杂度为 q*sqrt(n); 代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define Fopen freopen(&q

P3396 哈希冲突 (根号算法)

题目链接:https://www.luogu.org/problemnew/show/P3396 题目描述 众所周知,模数的hash会产生冲突.例如,如果模的数p=7,那么4和11便冲突了. B君对hash冲突很感兴趣.他会给出一个正整数序列value[]. 自然,B君会把这些数据存进hash池.第value[k]会被存进(k%p)这个池.这样就能造成很多冲突. B君会给定许多个p和x,询问在模p时,x这个池内数的总和. 另外,B君会随时更改value[k].每次更改立即生效. 保证1<=p<

hdoj 1151 Air Raid【匈牙利算法+二分最小顶点覆盖】

Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3861    Accepted Submission(s): 2552 Problem Description Consider a town where all the streets are one-way and each street leads from one

【算法总结】根号算法相关

[莫队算法] [相关资料] <[莫队算法]> [相关题目] 1.[bzoj2038][2009国家集训队]小Z的袜子(hose) 题意:给出n个数与m个区间,在每个区间内选出两个数,求选出的两个数相等的概率. 分析:hzwerの博客 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #define LL long long 6 usin

D. Time to Raid Cowavans 分块暴力,感觉关键在dp

对于b大于 sqrt(n)的,暴力处理的话,那么算出每个的复杂度是sqrt(n),就是把n分成了sqrt(n)段, 其他的,b小于sqrt(n)的,那么就最多只有sqrt(n)个,考虑到,如果b相同的话,放在一起,能不能记录一个结果呢? 用dp[pos]表示从pos这个位置开始,间隔为b的答案值. 那么需要从后面往前dp,每次转移dp[i] = dp[i + b] + a[i]即可 #include <cstdio> #include <cstdlib> #include <

(分块暴力)Time to Raid Cowavans CodeForces - 103D

题意 给你一段长度为n(1 ≤ n ≤ 3·1e5)的序列,m (1 ≤ p ≤ 3·1e5)个询问,每次询问a,a+b,a+2b+...<=n的和 思路 一开始一直想也想不到怎么分,去维护哪些信息,看了题解才知道 其实分块不仅仅可以将一列序列分块,还可以将数据进行分块,下面讨论具体做法 首先这道题不是在线询问,可以离线做,先读入所有的询问,将询问从小到大排序①当b<√n时,对于每一个b我们可以预处理出这样的一个数组sum[i],就是以i为起点间隔为b的序列和(可以用一个简单的dp求出来),然

Noip前的大抱佛脚----根号对数算法

根号算法 分块 数列分块入门九题(hzwer) 入门题1,2,3,4,5,7 问题:给一段区间打上标记后单点查询 解法:主要是每块维护一些标记,计算答案等,此类分块较为简单 注意:块大小一般为\(\sqrt n\) 复杂度:\(O(n\sqrt n)\) 入门题6 问题:每次朝数列中间插入一个元素,查询第k个元素是什么 解法:块大小超过一定值后暴力重构!采用链表实现 复杂度:\(O(n\sqrt n)\) 入门题8 问题:每次询问一个区间内为\(c?\)的元素个数,并把整个区间改为\(c?\)

大数质因解:浅谈Miller-Rabin和Pollard-Rho算法

2017-07-19 08:54 Amphetamine:能发一下代码吗? 应我那位谜一样好友的邀约,我打算好好看一看Miller-Rabin和Pollard-Rho算法.很奇怪,各种地方有很多代码描述详细过程,但我仍旧很懵.也许是我太弱了,不能从那些“鱼龙混杂”的代码中找出本质上的共性.那么,我们现在来讨论一下吧. 首先,大整数分解现在仍然是个世界级的难题,在“公共密钥”的研究上有着重要的作用. !!先判断质数!! 试除法:原始的根号算法 额.不想说了.正经一点. Miller-Rabin:判