Description

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

\(n,m \leq 300000,a_i \leq 10^9\)

Solution

对 \(k\) 即公差分块。设定一个 \(T\) 。

当 \(k > T\) 时,直接暴力算。复杂度 \(O(\frac{n}{T})\);

当 \(k \le T\) 时,对于 \(k\) 建立一个后缀和数组 \(sum\)。\(sum_i\) 表示从 \(n\) 开始往前这么跳公差 \(k\) 跳到 \(i\) 的和。它可以倒着遍历用 \(sum_i = sum_{i+k} + a_i\) 更新。复杂度 \(O(n)\)

取 \(T = \sqrt n\) 则可以预处理出所有小于 \(T\) 的 \(k\) 的 sum。复杂度 \(O(n \sqrt n)\)

但这样空间爆炸(MLE)所以开一个 sum 数组,把询问按照 \(k\) 从小到大排序。每次若 \(k>T\) 暴力;\(k \leq T\) 时重新更新 sum。由于询问中最多有 \(T\) 个不同的数 \(\leq T\)(废话) 所以更新的复杂度不会超过 \(n \sqrt n\)

所以总时间复杂度是 \(O(n \log n + n \sqrt n)\)

Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 300100;
int n, m, a[N];
ll sum[N], Ans[N];
struct node {
int t, k, id;
} Q[N];
inline bool cmp(node x, node y) {
return x.k == y.k ? x.t > y.t : x.k < y.k;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
int T = floor(sqrt(n));
scanf("%d", &m);
for(int i = 1; i <= m; i++) {
scanf("%d %d", &Q[i].t, &Q[i].k);
Q[i].id = i;
} sort(Q + 1, Q + m + 1, cmp); int last = n;
for(int i = 1; i <= m; i++) {
ll ans = 0;
if(Q[i].k >= T) {
for(int j = Q[i].t; j <= n; j += Q[i].k)
ans += a[j];
} else { int k = Q[i].k, t = Q[i].t;
if(Q[i].k != Q[i - 1].k) last = n;
for(int j = last; j >= t; j--) {
sum[j] = a[j];
if(j + k <= n) sum[j] += sum[j + k];
}
last = t - 1; ans = sum[t];
} Ans[Q[i].id] = ans;
}
for(int i = 1; i <= m; i++) printf("%lld\n", Ans[i]);
return 0;
}

题解【CF103D Time to Raid Cowavans】的更多相关文章

  1. 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$ 题解: 这种跳 ...

  2. Codeforces Beta Round #80 (Div. 1 Only) D. Time to Raid Cowavans 离线+分块

    题目链接: http://codeforces.com/contest/103/problem/D D. Time to Raid Cowavans time limit per test:4 sec ...

  3. CodeForces 103D Time to Raid Cowavans 询问分块

    Time to Raid Cowavans 题意: 询问 下标满足 a + b * k 的和是多少. 题解: 将询问分块. 将b >= blo直接算出答案. 否则存下来. 存下来之后,对于每个b ...

  4. CodeForces 103 D Time to Raid Cowavans

    Time to Raid Cowavans 题意:一共有n头牛, 每头牛有一个重量,m次询问, 每次询问有a,b 求出 a,a+b,a+2b的牛的重量和. 题解:对于m次询问,b>sqrt(n) ...

  5. Codeforces103D - Time to Raid Cowavans

    Portal Description 给出长度为\(n(n\leq3\times10^5)\)的序列\(\{a_n\}\),进行\(q(q\leq3\times10^5)\)次询问:给出\(x,y\) ...

  6. 【CF103D】Time to Raid Cowavans(分块)

    题意: 思路:院赛防AK题,然而还没来得及做就被数据出锅的题坑了…… #include<cstdio> #include<cstring> #include<string ...

  7. Codeforces Beta Round #80 (Div. 1 Only) D. Time to Raid Cowavans 分块

    D. Turtles Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/103/problem/D ...

  8. CodeForces - 103D Time to Raid Cowavans

    Discription As you know, the most intelligent beings on the Earth are, of course, cows. This conclus ...

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

    题意 给你一段长度为n(1 ≤ n ≤ 3·1e5)的序列,m (1 ≤ p ≤ 3·1e5)个询问,每次询问a,a+b,a+2b+...<=n的和 思路 一开始一直想也想不到怎么分,去维护哪些 ...

随机推荐

  1. redis使用哈希槽实现集群

    Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...

  2. It isn't possible to write into a document from an asynchronously-loaded

    It isn't possible to write into a document from an asynchronously-loaded   今天遇到了一个问题: 通过document.wri ...

  3. 冲刺One之站立会议4 /2015-5-17

    今天我们继续了昨天未完成的部分,把服务器端的在线人数显示做了出来,但是在调试的时候还有一些不可预知的自己也不会改的bug,让我们有点不知所措,启动时间的显示相对来说比较容易实现. 燃尽图4

  4. 我的JAVA运算符理解

    基本概念 原码,反码,补码 只需要记住这几句就够了  1.二进制的最高位是符号位:0表示正数,1表示负数 2.正数的原码,反码,补码都一样 3.负数的反码=它的原码符号位不变,其他位取反 4.负数的补 ...

  5. 【第十周】psp

    代码累计 300+575+475+353+620+703=2926 随笔字数 1700+3000+3785+4210+4333+3032=20727 知识点 机器学习,支持向量机 数据库技术 Acm刷 ...

  6. strtr、str_replace()、substr_replace、preg_replace之间的区别

    strtr(string, from, to): 逐个字符开始替换,以from跟to中长度较较短的一个为准,例如: strtr("aidengni","ai", ...

  7. php连接池 php–cp

    原文地址:http://blog.sina.com.cn/s/blog_9eaa0f400102v9fd.html 数据库连接池php-cp介绍时间 2015-01-23 11:53:05 数据库连接 ...

  8. Android Service执行unbind后再次执行bind的问题

    在执行了startService.bindService.unbindService之后,再次执行bindService.这时发现Service的onBind方法并没有执行,而是执行的onRebind ...

  9. java 数字转中文

    java代码 数字转中文,该方法只做了对int型整数的转换 private static String numberToChinese(int number) { String[] numbers = ...

  10. Mysql 5.7 报错 3534 错误

    需要先 执行 mysqld  --initialize 然后  mysqld --install 最后  net start mysql 即可启动服务 如果不执行第一步 则会报错