51Nod-1081 子段求和

2023-10-04 20:30
文章标签 51nod 1081 子段 求和

本文主要是介绍51Nod-1081 子段求和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1081 子段求和 

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和。

例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1。3 + 7 + 9 = 19,输出19。

Input

第1行:一个数N,N为数组的长度(2 <= N <= 50000)。
第2 至 N + 1行:数组的N个元素。(-10^9 <= N[i] <= 10^9)
第N + 2行:1个数Q,Q为查询的数量。
第N + 3 至 N + Q + 2行:每行2个数,i,l(1 <= i <= N,i + l <= N)

Output

共Q行,对应Q次查询的计算结果。

Input示例

5
1
3
7
9
-1
4
1 2
2 2
3 2
1 5

Output示例

4
10
16
19

连续子段求和,树状数组是极为方便的,插线取点

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;int n;
long long a[50010];int lowbit( int x ){return x & -x;
}void add( int pos , long long val ){while( pos<=n ){a[pos] += val;pos += lowbit(pos);}
}long long query( int pos ){if( pos==0 )return 0;long long sum = 0;while( pos>0 ){sum += a[pos];pos -= lowbit(pos);}return sum;
}int main(){
//	freopen( "in.txt","r",stdin );while( ~scanf( "%d",&n ) ){int val;for( int i=1 ; i<=n ; i++ ){ scanf( "%lld",&val );add( i,val );}int q,s,e;scanf( "%d",&q );for( int i=0 ; i<n ; i++ ){scanf( "%d %d",&s,&e );printf( "%lld\n",query(s+e-1)-query(s-1) );} }return 0;
}

 

这篇关于51Nod-1081 子段求和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2669

相关文章

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

Leetcode67---二进制求和

https://leetcode.cn/problems/add-binary/description/ 给出的两个二进制,我们可以从最后开始往前运算。 给当前短的一位前面补充0即可。 class Solution {public String addBinary(String a, String b) {//给的就是二进制字符串 最后一位开始遍历 如果没有就补充0?StringBuil

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =

【hdu】敌兵布阵(线段树,更加结点,区间求和)

最近开始刷线段树,主要围绕notonlysuccess的线段树总结刷。 结点修改还是比较简单的,不需要什么懒惰标记,直接二分递归就可以了。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vecto

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行:nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​ 输出格式 单个整数:表示最长的前缀长度,使得前缀的和大于等于 00 数据范围

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

C/C++的阶乘求和以及变量存储数据大小

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 其实刚学C语言的时候,打击都会先认识,类型,像int,double之类的存储类型。在这篇文章中,就需要大家对这个大小有了解。 2. 正文 2.1 问题 题目描述: 一个正整数如果等于组成它的各位数字的阶乘之和,该整数

位运算 - 异或求和

异或求和 Problem's Link:  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1254   Mean:  Description给你2个区间[A,B]和[C,D],现在只要求你求出区间[A,B]和[C,D]内任意2个整数异或后的和,因为答案可能会很大,你只需将结果%mod即可。For(i:A→B)For(j:

【51nod】算法马拉松4 F 移数字 【快速求N!%P】【FFT】

传送门:【51nod】算法马拉松4 F 移数字 涉及知识点:多项式求逆,多项式除法,多点插值,阶乘取模。 对于N!%P,复杂度为 O(N−−√log2N−−√) O(\sqrt N \log^2\sqrt N)。 但常数巨大,和暴力算实际复杂度只相差常数= = 这个是可以扩展到组合数取模的~ my  code: my~~code: #include <stdio.h>#includ

【线段树】-POJ-3468-区间增减区间求和

依然是模板,原版来自hh大神 题目链接:http://poj.org/problem?id=3468 lazy的思想还是蛮有用的吧。。不只是线段树 #include <cstdio>#include <algorithm>#include <cstring>#include <iostream>typedef long long ll;using namespace std;#