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. 常用DB2命令

    建库 db2 territory CN on 建库到指定位置 db2 create database OADB on D: using codeset GBK territory CN 列出所有数据库 ...

  2. CF 1100C NN and the Optical Illusion(数学)

    NN is an experienced internet user and that means he spends a lot of time on the social media. Once ...

  3. Scrum meeting报告

    Scrum Meeting报告 要点: 讨论XueBa系统已有的和待实现的功能 短期内的任务分配 初步确定小组成员在第一轮迭代开发中任务 一.      XueBa系统已有的和待实现的功能 项目完成情 ...

  4. RocEDU.阅读.写作选择书目

    很高兴加入这样一个专门于读书.写作的群. 一.选择图书 通识类: <你的灯亮着吗> 作者: 高斯 (Donald C. Gause) / 温伯格 (Gerald M.Weinberg) 出 ...

  5. 20172308 实验三《Java面向对象程序设计 》实验报告

    20172308 2017-2018-2 <程序设计与数据结构>实验三报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 周亚杰 学号:20172308 实验教师:王 ...

  6. 2017-2018-2学期 20172324《Java程序设计》第六周学习总结

    20172324<Java程序设计>第六周学习总结 教材学习内容总结 如何创建数组以及int[] X与int X[]的区别(编译时是没有差别的,只是前者与其他类型的声明方式有一致性) 每一 ...

  7. 项目Beta冲刺(团队)随笔集

    凡事预则立 项目Beta冲刺准备 第一天 项目Beta冲刺(团队)第一天 第二天 项目Beta冲刺(团队)第二天 第三天 项目Beta冲刺(团队)第三天 第四天 项目Beta冲刺(团队)第四天 第五天 ...

  8. NABCD(网上投票系统)

    网上投票系统 N(need) 投票这件事情,在所有事情上都可能用得到,在互联网的影响下,投票的范围变得越来越广,比如在商业的里,往往要做市场分析,那么在互联网这个大的前提下,用网上投票系统来获取用户的 ...

  9. 结对随即四则运算(带界面Java版)

    //随机四则运算类 public class 随机四则运算 { public static void main(String[] args) { new 界面();//进入随机四则运算的首界面 } } ...

  10. 福州大学软工1816 K 班助教总结

    春节时期总有各种诱惑因素(例如路人超能第二季),拖到现在才发布十分抱歉orz. 一.感谢 首先对柯老师和软工助教指导团队这一学期以来的支持和指导表示感谢.第一次做助教,有时候会提出一些不大成熟的想法, ...