首页 > 其他分享 >CF1921 F Sum of Progression 题解

CF1921 F Sum of Progression 题解

时间:2024-01-18 13:23:43浏览次数:29  
标签:cnt ch CF1921 题解 Sum read int cdot sum

Question

CF1921 F Sum of Progression

给定一个序列 \(\{a\}\) ,有 \(q\) 组询问,对于每组询问 \(s,d,k\),求

\[a_s+a_{s+d}\cdot 2+\cdots+a_{s+d(k-1)}\cdot k \]

Solution

\(s,d,k\) 其实就是在描述一个等差数列

考虑到 \(d\times k \le n\) 如果 \(d\) 很大,那么就意味着 \(k\) 很小,反之亦然

所以考虑根号分治,对于 \(d > \sqrt{n}\) 的直接处理

\(d \le \sqrt{n}\) 的情况预处理,然后用前缀和求和

具体这么使用前缀和求解答案

不妨先考虑 \(s=1,d=1\) 的情况

\(a_1\cdot 1+a_2 \cdot 2+ a_3 \cdot 3+\cdots+ a_n\cdot n\)

设 \(f[i]=\sum\limits_{j=1}^i a_i\times i\)

如果我们想要求 \(s=3,d=1,k=2\)

只需要用 \(f[5]-f[3-1]-\sum\limits_{i=3}^5 a_i\)

后面那一项可以再构造一个前缀和,设 \(s[i]=\sum\limits_{j=1}^i a[i]\)

那么 \(ans=f[5]-f[2]-(s[5]-s[2])\times 2\)

后面的 \(\times 2\) 其实就是把前面多乘的项减去

当 \(d\ne 1\) 的情况也类似

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

void print(LL x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);
    putchar(x%10+'0');
}

LL sum[100005][305],tsum[100005][305];

void solve(){
    int n=read(),Q=read();
    int tot=0;
    vector<LL> a(n+1); 
    int block = min((int)sqrt(n),300);
    for(int i=1;i<=n;i++) a[i]=read();

    for(int d=1;d<=block;d++){
        for(int i=1;i<=d;i++){
            for(int j=i,cnt=1;j<=n;j+=d,cnt++){
                tot++;
                if(j-d > 0) tsum[j][d] = tsum[j-d][d] + a[j]*cnt, sum[j][d] = sum[j-d][d] + a[j];
                else tsum[j][d] = a[j]*cnt, sum[j][d] = a[j];
            }
        }
    }
    
    while(Q--){
        int s=read(),d=read(),k=read(); LL ans=0;
        if(d > block){
            for(int i=s,cnt=1;cnt<=k;i+=d,cnt++)
                ans += a[i]*cnt;
        }
        else{
            int st = s, ed = s+d*(k-1);
            int num = (st- 1) / d;
            ans = (tsum[ed][d] - tsum[max(st-d,0)][d]) - (sum[ed][d] - sum[max(st-d,0)][d]) * num;
        }
        print(ans);putchar(' ');
    }
    putchar('\n');
}

int main(){
    freopen("F.in","r",stdin);
    freopen("F1.out","w",stdout);
    int T=read();
    while(T--) solve();
    return 0;
}

标签:cnt,ch,CF1921,题解,Sum,read,int,cdot,sum
From: https://www.cnblogs.com/martian148/p/17972285

相关文章

  • 题解 CF653F Paper task
    CF653FPapertask给定一个长度为\(n\)和括号串,求本质不同的合法括号串个数。\(n\le5\times10^5\)。考虑如果不是求本质不同,可以想到DP。设\(f_{i}\)表示以\(i\)结尾的括号串数,容易发现\(f_{i}=f_{t_{i}-1}+1\),其中\(t_{i}\)表示与\(i\)匹配的左括号位置。用栈......
  • 【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)
    承接上文在阅读了上篇文章《【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)》之后,相信您对HashMap的基本原理和基础结构已经有了初步的认识。接下来,我们将进一步深入探索HashMap的源码,揭示其深层次的技术细节。通过这次解析,您将更深入地理解HashMap的......
  • chrome浏览器闪屏问题解决
    描述:我在浏览B站时,在打字时突然出现了闪屏,反应很强烈!一输入就出现!我还一直以为是电脑显卡出了问题!后来查询资料发现这是谷歌很久以前的一个bug,至今都没有修复!至少在我发帖之前一直是没有解决的!开启硬件加速若想使用硬件加速,可以在网址栏输入:chrome://flags/选择ChooseANGL......
  • CF1633B题解
    Minority题面翻译给定一个\(01\)字符串\(s\),定义\(c_k(l,r)\)表示\(s\)的由下标为\([l,r]\)中的字母构成的连续子串中\(k\)的个数。定义\(f(l,r)=\begin{cases}c_0(l,r)&c_0(l,r)<c_1(l,r)\\c_1(l,r)&c_0(l,r)>c_1(l,r)\\0&c_0(l,r)=c_1(l,r)\end{cases}\),求......
  • P3391 文艺平衡树 题解
    QuestionP3391文艺平衡树写一种数据结构维护有序数列,需要完成以下操作:翻转一个区间,例如原有的序列是\(5,3,3,2,1\),翻转区间是\([2,4]\)的话,结果是\(5,2,3,4,1\)Solution这道题的表达是\(Splay\)但是\(Splay\)的代码实现比较困难,考虑使用FHQTreap。先思考如何将一......
  • CF1633A题解
    Div.7题面翻译给定\(t\)组数据。每组数据给定一个数\(n\)(\(10\len\le999\))。每次操作可以修改\(n\)任意一位上的数,将这一位上的数修改为\(0\sim9\)之间的任意数。要求使用最少的修改次数使这个数修改后是\(7\)的倍数,并且没有多余的前导\(0\)。输出修改后的数,如......
  • CF1637A题解
    SortingParts题面翻译给定一个长度为n的数组a。你可以执行恰好一次操作。每次操作选择一个在[1,n-1]内的整数len,然后将数组a中长度为len的前缀和长度为n-len的后缀分别排序。请判断是否能够通过操作,使得最终的数组a不满足\foralli\in[1,n),a_i<=a(i+1)。数据范......
  • [ARC169E] Avoid Boring Matches 题解
    题目链接首先考虑无解的情况,一个显然的观察是如果R的个数大于一半,那么无论如何都会出现两个R比赛的情况,小于一半时我们可以调整使得B全都在前面,显然有解。接下来问题变为找到最优可行解,但是状态的合法性不是显然的,我们先尝试判定这个问题。先考虑第一轮比赛,显然我们想让......
  • 无涯教程-SQL SUM Function函数
    SQLSUM函数用于查找各种记录中一个字段的总和。要了解SUM函数,请考虑一个employee_tbl表,该表具有以下记录-SQL>SELECT*FROMemployee_tbl;+------+------+------------+--------------------+|id|name|work_date|daily_typing_pages|+------+------+---......
  • SP839Optimal Marks 题解
    part1:建图二进制异或,每一位互不干扰。所以对每一位分开来考虑。然后变成了一个经典的模型。当前每一个未确定点有两个选择:变成\(1\),变成\(0\);已经确定的点只能选它本身的值。于是构造思路非常套路了:构造虚点\(S\)、\(T\)。对于一个点\(u\),从\(S\)连向\(u\)一条边,值为......