线段树练习(单点增减)

CODEVS 1080 线段树练习

题目描述

一行N个方格,开始每个格子里都有一个整数。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N<100000,,提问和修改的总数m<10000条。

输入描述

输入文件第一行为一个整数N,接下来是n行n个整数,表示格子中原来的整数。接下一个正整数m,再接下来有m行,表示m个询问,第一个整数表示询问代号,询问代号1表示增加,后面的两个数x和A表示给位置X上的数值增加A,询问代号2表示区间求和,后面两个整数表示a和b,表示要求[a,b]之间的区间和。

输出描述

共m行,每个整数。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 long long sum[400000+10];
 5 int n,m;
 6 int ql,qr;
 7 long long query(int o,int L,int R){
 8     int M=L+(R-L)/2;
 9     long long ans=0;
10     if(ql<=L&&R<=qr) return sum[o];
11     if(ql<=M) ans+=query(2*o,L,M);
12     if(M<qr) ans+=query(2*o+1,M+1,R);
13     return ans;
14 }
15 int p,v;
16 void update(int o,int L,int R){
17     int M=L+(R-L)/2;
18     if(L==R) sum[o]+=v;
19     else{
20         if(p<=M) update(2*o,L,M); else update(2*o+1,M+1,R);
21         sum[o]=sum[2*o]+sum[2*o+1];
22     }
23 }
24 int main()
25 {
26     cin>>n;
27     memset(sum,0,sizeof(sum));
28     for(int i=1;i<=n;i++){
29         cin>>v;
30         p=i;
31         update(1,1,n);
32     }
33     cin>>m;
34     int op,a,b;
35     for(int i=1;i<=m;i++){
36         cin>>op>>a>>b;
37         if(op==1){
38             p=a,v=b;
39             update(1,1,n);
40         }else{
41             ql=a,qr=b;
42             cout<<query(1,1,n)<<endl;
43         }
44     }
45     return 0;
46 }
时间: 2024-10-05 17:40:01

线段树练习(单点增减)的相关文章

hdu 1166 线段树(单点增减 区间求和)

Sample Input1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Sample OutputCase 1:63359 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath>

线段树 基础单点更新 敌兵布阵

题:敌兵布阵 标准线段树模板代码: #include<cstdio> #include<cstring> const int maxn = 500000 + 10; struct Node{ int left, right, count; }node[maxn]; int a[maxn]; /*********************************** ***************建树**************** ************i是区间序号********

Can you answer these queries?(线段树之单点更新)

萌萌哒的传送门 因为一个long long 范围内的数开方不会超过10次,所以题目就转化为线段树的单点更新问题. #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <queue> #include <vector> #include <cstdlib> #includ

hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)

敌兵布阵                                                                             Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵

hdu 1754 I Hate It(线段树 之 单点更新 求最值)

I Hate It                                                                             Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢

POJ 3264-Balanced Lineup(线段树:单点更新+区间查询)

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34522   Accepted: 16224 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)

题目链接 题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的数开几次方之后都会变成1,所以到了1不用没完没了的更新. 1 //HDU 4027 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <iostream> 6 #defi

HDU 1754-I Hate It(线段树:单点更新,区间最值)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 39163    Accepted Submission(s): 15507 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师

HDU 3074-Multiply game(线段树:单点更新,区间求积)

Multiply game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1450    Accepted Submission(s): 508 Problem Description Tired of playing computer games, alpc23 is planning to play a game on numbe

HDU 1166-敌兵布阵(线段树:单点更新,区间求和)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 44361    Accepted Submission(s): 18875 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务