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("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
 4 #define LL long long
 5 #define ULL unsigned LL
 6 #define fi first
 7 #define se second
 8 #define pb push_back
 9 #define lson l,m,rt<<1
10 #define rson m+1,r,rt<<1|1
11 #define max3(a,b,c) max(a,max(b,c))
12 #define min3(a,b,c) min(a,min(b,c))
13 #define Show(x) cout << x << ‘ ‘;
14 typedef pair<int,int> pll;
15 const int INF = 0x3f3f3f3f;
16 const LL mod =  (int)1e9+7;
17 const int N = 3e5 + 100;
18 int n, m, k, p;
19 int w[N];
20 LL tot[N];
21 LL ans[N];
22 struct Node{
23     int a, b, id;
24 }q[N];
25 bool cmp(Node x1, Node x2){
26     return x1.b < x2.b;
27 }
28 int main(){
29     scanf("%d", &n);
30     for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
31     scanf("%d", &p);
32     k = sqrt(n);
33     int t = 0, a, b;
34     LL tmp;
35     for(int i = 1; i <= p; i++){
36         scanf("%d%d", &a, &b);
37         if(b >= k){
38             tmp = 0;
39             for(int i = a; i <= n; i += b)
40                 tmp += w[i];
41             ans[i] = tmp;
42         }
43         else {
44             q[t].a = a;
45             q[t].b = b;
46             q[t].id = i;
47             t++;
48         }
49     }
50     sort(q,q+t,cmp);
51     for(int i = 0; i < t; i++){
52         if(i == 0 || q[i].b != q[i-1].b){
53             b = q[i].b;
54             for(int i = n; i >= 1; i--){
55                 if(i+b > n) tot[i] = w[i];
56                 else tot[i] = tot[i+b] + w[i];
57             }
58         }
59         ans[q[i].id] = tot[q[i].a];
60     }
61     for(int i = 1; i <= p; i++){
62         printf("%I64d\n", ans[i]);
63     }
64     return 0;
65 }

CF103 D

原文地址:https://www.cnblogs.com/MingSD/p/9104959.html

时间: 2024-10-29 22:01:26

CodeForces 103 D Time to Raid Cowavans的相关文章

【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\)个 所以复杂度不

(分块暴力)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求出来),然

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 <

RAID及软RAID的实现

1 RAID: 2 Redundant Arrays of Inexpensive Disks 3 Redundant Arrays of Independent Disks 独立冗余磁盘阵列 4 5 Berkeley: A case for Redundent Arrays of Inexpensive Disks RAID 6 7 提高IO能力: 8 磁盘并行读写:0 9 提高耐用性: 10 磁盘冗余来实现 11 12 级别:多块磁盘组织在一起的工作方式有所不同: 13 RAID实现的方式:

最短路 Codeforces Round #103 (Div. 2) D. Missile Silos

题目传送门 1 /* 2 最短路: 不仅扫描边,还要扫描点:点有两种情况,一种刚好在中点,即从u,v都一样,那么最后/2 3 还有一种是从u,v不一样,两种的距离都是l 4 模板错了,逗了好久:( 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cmath> 10 #include <vector> 11 #include <q

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题是线段树成段更新,但是不能直接更新,不然只能一个数一个数更新.这样只能把每个数存到一个数组中,长度大概是20吧,然后模拟二进制的位操作.仔细一点就行了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath>

Codeforces Round#413 Problem A - C

[写在前面感(乱)叹(七)人(八)生(糟)的话] 本想借此机会一口气玩到蓝名,结果,A题写炸(少判了一种情况),C题写炸(辜负了我5分钟狂敲出来的线段树),结果又掉Rating...内心好绝望... Problem#A Carrot Cakes vjudge链接[here] (偷个懒,cf链接就不给了) 题目大意是说,烤面包,给出一段时间内可以考的面包数,建第二个炉子的时间,需要达到的面包数,问建炉子是否合理. 玄学 & 智商题,可能是因为我智商不够,所以在我决定休息的时候被hank掉了...

CodeForces 76A Gift - 最小生成树

The kingdom of Olympia consists of N cities and M bidirectional roads. Each road connects exactly two cities and two cities can be connected with more than one road. Also it possible that some roads connect city with itself making a loop. All roads a