zoukankan      html  css  js  c++  java
  • 分治思想 特别常用 Codeforces Beta Round #80 (Div. 1 Only) D

    D. Time to Raid Cowavans
    time limit per test
    4 seconds
    memory limit per test
    70 megabytes
    input
    standard input
    output
    standard output

    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.

    Input

    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).

    Output

    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.

    Examples
    input
    3
    1 2 3
    2
    1 1
    1 2
    output
    6
    4
    input
    4
    2 3 5 7
    3
    1 3
    2 3
    2 2
    output
    9
    3
    10

    题目大意:给你一个长度为n的序列w,求w[x] + w[x+y] + w[x+2y] + ... + w[x + py],其中x+py <= n

    思路:

    首先,我们可以知道,大于sqrt(n)的询问,我们暴力,那么复杂度就是sqrt(n),所以假设所有的询问都是>=sqrt(n)的,那么我们的复杂度最坏为n*sqrt(n)

    假设如果所有的询问都不相同,如果单纯暴力的话,复杂度为n/1 + n/2 + n/3 + n/4 + n/5 + ... + n/n-1 + n/n,所以为n*ln(n)(证明自己去证吧)

    那么,如果存在许多的询问的长度都相等,那么我们就分治的思想去解决。

    对于>=sqrt(n),我们暴力即可

    对于<sqrt(n)的,我们把它全部都放到一个vector里面去,定义vector<pair<int, int>> ve[i]来储存目前y=i的东西,然后就很好做了

    详见2014年国家集训队论文《根号算法——不只是分块》

    ///bicat
    //看看会不会爆int!数组会不会少了一维!
    //取物问题一定要小心先手胜利的条件
    #include <bits/stdc++.h>
    using namespace std;
    #pragma comment(linker,"/STACK:102400000,102400000")
    #define LL long long
    #define ALL(a) a.begin(), a.end()
    #define pb push_back
    #define mk make_pair
    #define fi first
    #define se second
    #define haha printf("haha
    ")
    const int maxn = 3e5 + 1000;
    /*
    首先,对于大于sqrt(n)的,我们直接暴力
    对于小于的,我们根据步数的大小,放到vector里面去,每次都进行暴力即可
    */
    LL w[maxn], sum[maxn], ans[maxn];
    vector<pair<int, int> > ve[maxn];
    int n, q;
    
    int main(){
        cin >> n;
        for (int i = 1; i <= n; i++){
            scanf("%lld", w + i);
        }
        int block = sqrt(n) + 1;
        cin >> q;
        for (int i = 1; i <= q; i++){
            int x, y; scanf("%d%d", &x, &y);
            if (y >= block){
                for (int j = x; j <= n; j += y){
                    ans[i] += w[j];
                }
            }
            else {
                ve[y].push_back(mk(i, x));
            }
        }
        for (int i = 1; i < block; i++){
            if (ve[i].size()){
                memset(sum, 0, sizeof(sum));
                for (int j = n; j >= 1; j--){
                    sum[j] = sum[j + i] + w[j];
                }
                for (int j = 0; j < ve[i].size(); j++){
                    int id = ve[i][j].first, pos = ve[i][j].second;
                    ans[id] = sum[pos];
                }
            }
        }
        for (int i = 1; i <= q; i++)
            printf("%lld
    ", ans[i]);
        return 0;
    }
    View Code
  • 相关阅读:
    GIT SSH免登录密码实现更新(git pull)、推送(git push)操作
    Gulp新手入门教程
    常见的反爬虫的方式
    retrying模块的使用
    通过pyppeteer来爬取今日头条
    Selenium详解
    scrapy框架来爬取壁纸网站并将图片下载到本地文件中
    Elasticsearch简介
    使用scrapy框架来进行抓取的原因
    python(三):面向对象--类和实例
  • 原文地址:https://www.cnblogs.com/heimao5027/p/6559874.html
Copyright © 2011-2022 走看看