我是靠谱客的博主 拼搏小甜瓜,最近开发中收集的这篇文章主要介绍凡人升天传2——「一本通 4.1 例 1」数列操作题目描述样例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目描述

给定n个数列,规定有两种操作,一是修改某个元素,二是求子数列[a,b]的连续和。数列的元素个数最多是10万个,询问操作最多10万次。

输入

第一行2高整数n,m(n表示输入n个数,m表示有m个操作)。保证1≤n,m≤10^6

第二行输入n个数列。

接下来m行,每行有三个数k,a,b(k=2,表示求子数列[a,b]的和;k=1,表示第a个数加b)。

输出

输出若干行数字,表示k=2时,对应的子数列[a,b]的连续和。

保证1≤a≤b≤n,|b|≤10^6

样例

输入数据 1

3 2
1 2 3
1 2 0
2 1 3

输出数据 1

6

题解如下:
 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=5e4+5;
ll n,m,c1[MAXN],c2[MAXN];
ll lowbit(ll i){
return i&(-i);
}
void u1(ll x,ll value){
for(ll i=x;i<=n;i+=lowbit(i))
c1[i]+=value;
}
ll find1(ll x){
ll res=0;
for(ll i=x;i;i-=lowbit(i))
res+=c1[i];
return res;
}
void u2(ll x,ll value){
for(ll i=x;i<=n;i+=lowbit(i))
c2[i]+=value;
}
ll find2(ll x){
ll res=0;
for(ll i=x;i;i-=lowbit(i))
res+=c2[i];
return res;
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1,k,l,r;i<=m;i++){
scanf("%lld%lld%lld",&k,&l,&r);
if(k==1){
u1(l,1);
u2(r,1);
}
else
printf("%lldn",find1(r)-find2(l-1));
}
}

最后

以上就是拼搏小甜瓜为你收集整理的凡人升天传2——「一本通 4.1 例 1」数列操作题目描述样例的全部内容,希望文章能够帮你解决凡人升天传2——「一本通 4.1 例 1」数列操作题目描述样例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部