zoukankan      html  css  js  c++  java
  • CF103D Time to Raid Cowavans(分块)

    套路题,对于步长大于根号n的,直接暴力做,对于步长小于根号n的,保留离线后

    对于每个步长for一遍,这样复杂度也是n*根号n

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=5e5+10;
    const int mod=1e9+7;
    ll sum[N];
    ll a[N];
    vector<pll> num[N];
    ll ans[N];
    int main(){
        //ios::sync_with_stdio(false);
        int n;
        cin>>n;
        int block=sqrt(n);
        int i;
        for(i=1;i<=n;i++){
            scanf("%lld",&a[i]);
        }
        int m;
        cin>>m;
        for(i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            if(y>block){
                for(int j=x;j<=n;j+=y){
                    ans[i]+=a[j];//步长大的直接暴力
                }
            }
            else{
                num[y].push_back({i,x});
            }
        }
        for(i=1;i<=block;i++){//不超过nsqrt(n)
            if(num[i].size()){
                for(int j=n;j>=1;j--){
                    sum[j]=(j+i>n?0:sum[i+j])+a[j];
                }
                for(auto x:num[i]){
                    ans[x.first]=sum[x.second];
                }
            }
        }
        for(i=1;i<=m;i++){
            printf("%lld
    ",ans[i]);
        }
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    Makefile学习
    Tmux使用
    Linux进程管理学习资料
    Linux内存管理学习资料
    Python常用的软件包
    Docker 学习
    Intel处理器技术文档
    Firefly-RK3399笔记
    Linux Kernel API
    ARM 技术文档
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13874397.html
Copyright © 2011-2022 走看看