加权前缀和(玄关)
  • 板块灌水区
  • 楼主Lantern_LZY
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/4/16 20:24
  • 上次更新2024/4/16 22:21:02
查看原帖
加权前缀和(玄关)
894765
Lantern_LZY楼主2024/4/16 20:24
  1. 什么是加权,加权怎么算?
  2. 站外提求助

加权前缀和

题目描述

给定一个长度为 nn 的数列 aa 以及 qq 次询问。 询问共有两种:

询问1:给定 xx 和 yy,询问第xx个数至第 yy 个数的和

询问2:给定 xx 和 yy,询问第 x 个数至第 y 个数的加权和。

其中,区间内的第 1 个数的权重为 1,第 2 个数的权重为 2,以此类推。

输入格式

第一行包含一个正整数 n,表示数列长度。

第二行共有 n 个非负整数,表示数列 a。

第三行包含一个正整数 q,表示询问数量。

随后q行,每行三个正整数k、x、y,用来描述询问。k表示询问的类型,x、y表示询问的区间。

输出格式

共q行,每行一个整数,表示询问的答案。

样例 #1

样例输入 #1

5
1 2 3 4 5
3
1 2 4
2 2 3
2 3 5

样例输出 #1

9
8
26

提示

n, q<=100000,数列中的每个数不超过1000

  • 为什么第三组测试样例答案是26?3+4+5+1+2+3不是应该=19么?
  • 代码求调
#include<bits/stdc++.h>

using namespace std;

int lst[100005];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int x;
		cin>>x;
		lst[i]=lst[i-1]+x;
	}
	
	int m;
	cin>>m;
	for(int i=0;i<m;i++){
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1){
			cout<<lst[r-1]-lst[l-2]<<endl;
		}
		else{
			int q=0;
			for(int i=0;i<r-l+1;i++){
				q+=i+1;
			}
			cout<<lst[r-1]-lst[l-2]+q<<endl;
		}
	}
}

全wa~

求大神帮忙

2024/4/16 20:24
加载中...