Codeforces Beta Round #80 (Div. 1 Only) D. Time to Raid Cowavans 离线+分块
2016-07-28 23:00
357 查看
题目链接:
http://codeforces.com/contest/103/problem/DD. Time to Raid Cowavans
time limit per test:4 secondsmemory limit per test:70 megabytes问题描述
As you know, the most intelligent beings on the Earth are, of course, cows. This conclusion was reached long ago by the Martian aliens, as well as a number of other intelligent civilizations from outer space.
Sometimes cows gather into cowavans. This seems to be seasonal. But at this time the cows become passive and react poorly to external stimuli. A cowavan is a perfect target for the Martian scientific saucer, it's time for large-scale abductions, or, as the Martians say, raids. Simply put, a cowavan is a set of cows in a row.
If we number all cows in the cowavan with positive integers from 1 to n, then we can formalize the popular model of abduction, known as the (a, b)-Cowavan Raid: first they steal a cow number a, then number a + b, then — number a + 2·b, and so on, until the number of an abducted cow exceeds n. During one raid the cows are not renumbered.
The aliens would be happy to place all the cows on board of their hospitable ship, but unfortunately, the amount of cargo space is very, very limited. The researchers, knowing the mass of each cow in the cowavan, made p scenarios of the (a, b)-raid. Now they want to identify the following thing for each scenario individually: what total mass of pure beef will get on board of the ship. All the scenarios are independent, in the process of performing the calculations the cows are not being stolen.
输入
The first line contains the only positive integer n (1 ≤ n ≤ 3·105) — the number of cows in the cowavan.
The second number contains n positive integer wi, separated by spaces, where the i-th number describes the mass of the i-th cow in the cowavan (1 ≤ wi ≤ 109).
The third line contains the only positive integer p — the number of scenarios of (a, b)-raids (1 ≤ p ≤ 3·105).
Each following line contains integer parameters a and b of the corresponding scenario (1 ≤ a, b ≤ n).
输出
Print for each scenario of the (a, b)-raid the total mass of cows, that can be stolen using only this scenario.
Please, do not use the %lld specificator to read or write 64-bit integers in С++. It is recommended to use the cin, cout streams of the %I64d specificator.
样例
sample input
4
2 3 5 7
3
1 3
2 3
2 2
sample output
9
3
10
题意
给你n个数字的数组arr[],q个查询,对每个查询a,b,求数列和sigma(arr[a]+arr[a+b]+...)。
题解
这里用到了分块的思想:
如果所有的b都不相同你直接暴力也是可以做出来的(每次都按定义求和就好了),为什么呢,因为对于b>=sqrt(n)的,我们每次求和的时间<=sqrt(n),时间复杂度为q1 * sqrt(n);而对于小于等于sqrt(n)的b最多只有sqrt(n)个,我们每个查询求和最大的时间为o(n),时间复杂度为O(n * sqrt(n))。
如果很多b相同怎么办?首先,如果b>=sqrt(n),我们完全可以暴力做,所以我们只要考虑很多b相同并且b<sqrt(n)的情况。我们可以考虑离线处理,把相同的b都集中在一起,对所有相同的b我们只要O(n)处理一次步长为b的前缀和就可以了,这样,我们处理b<=sqrt(n)的情况就有能控制在O(n*sqrt(n))了。
代码
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #define X first #define Y second #define mkp make_pair using namespace std; typedef __int64 LL; const int maxn = 3e5 + 10; struct Node { int id, a, b; LL ans; bool operator < (const Node& tmp) const { return id < tmp.id; } }que[maxn]; bool cmp(const Node& n1, const Node& n2) { return n1.b < n2.b; } LL arr[maxn]; int n, q; LL sumv[maxn]; int len; LL solve(int a, int b) { if (b == len) { return sumv[a]; } else { for (int i = n; i >= 1; i--) { if (i + b > n) { sumv[i] = arr[i]; } else { sumv[i] = arr[i] + sumv[i + b]; } } len = b; return sumv[a]; } } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%I64d", &arr[i]); } scanf("%d", &q); for (int i = 0; i < q; i++) { int a, b; scanf("%d%d", &que[i].a, &que[i].b); que[i].id = i; } sort(que, que + q, cmp); len = -1; for (int i = 0; i < q; i++) { int a = que[i].a, b = que[i].b; LL ans = 0; if (b < sqrt(n)) { ans = solve(a, b); } else { for (int i = a; i <= n; i += b) { ans += arr[i]; } } que[i].ans = ans; } sort(que, que + q); for (int i = 0; i < q; i++) { printf("%I64d\n", que[i].ans); } return 0; }
相关文章推荐
- 2016 Personal Training #7 Div.2 CodeForces 589A Email Aliases
- error: command ‘gcc’ failed with exit status 1
- 1021 Fibonacci Again
- 2016 Multi-University Training Contest 4 欢乐战记
- Bringing up interface Auto_eth3: Error: Connection activation failed: Device not managed by Network
- 最长递增子序列 ( LIS )——The All-purpose Zero ( HDU 5773 ) ( 2016 Multi-University Training Contest 4 1010 )
- [HDU5764] After a Sleepless Night [2016 Multi-University Training Contest 4(2016多校联合训练4) B]
- 2016 Multi-University Training Contest 4 1012 hdu 5775(树状数组)
- main函数的argc和argv
- hdu 2389 Rain on your Parade(二分图最大匹配,Hopcroft-Karp)
- [HDU5741] Helter Skelter [2016 Multi-University Training Contest 2(2016多校联合训练2) H]
- Rails(栈和队列简单应用)
- ACboy needs your help again!(栈和队列简单应用)
- DP+KMP——Another Meaning ( HDU 5763 ) ( 2016 Multi-University Training Contest 4 1001 )
- spark error
- [HDU5739] Fantasia [2016 Multi-University Training Contest 2(多校联合训练2) F]
- 2016 Multi-University Training Contest 4
- 【水题】跑跑卡丁车系列之游戏下载
- hdu5763Another Meaning 2016 Multi-University Training Contest 4(kmp+dp)
- 设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij(1<=i,j<=n,且i<=j)在B中的位置为()