1080 線段樹練習

2021-07-16 00:19:42 字數 1698 閱讀 9645

一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改:提問的形式是求某乙個特定的子區間[a,b]中所有元素的和;修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1≤n<100000,,提問和修改的總數m<10000條。

輸入描述 input description

輸入檔案第一行為乙個整數n,接下來是n行n個整數,表示格仔中原來的整數。接下乙個正整數m,再接下來有m行,表示m個詢問,第乙個整數表示詢問代號,詢問代號1表示增加,後面的兩個數x和a表示給位置x上的數值增加a,詢問代號2表示區間求和,後面兩個整數表示a和b,表示要求[a,b]之間的區間和。

共m行,每個整數

6 4

5 6

2 1

3 4

1 3 5

2 1 4

1 1 9

2 2 6

22 22

1≤n≤100000, m≤10000 。

裸裸的線段樹,單點修改+區間求和。

#include

#include

#include

using

namespace

std;

#define m 1000010

#define lch now*2

#define rch now*2+1

#define smid (l+r)/2

int a[m];

struct node

;node sgt[m];

void build(int now,int l,int r)//建樹

build(lch,l,smid);

build(rch,smid+1,r);

sgt[now].sum=sgt[lch].sum+sgt[rch].sum;

}void modify(int now,int pos,int l,int r,int v)//修改

if(pos<=smid)

modify(lch,pos,l,smid,v);

else modify(rch,pos,smid+1,r,v);

sgt[now].sum=sgt[lch].sum+sgt[rch].sum;

}int query(int now,int l,int r,int x,int y)

int main()

return

0;}

聽說還有樹狀陣列,比線段樹更快,所以請教某犇打了乙個,

只用30ms就過了…..

#include

#include

#define maxn 100001

using namespace std;

int n,m,s[maxn];

intread()

while(ch>='0'&&ch<='9')x=x

*10+ch-48,ch=getchar();

return

x*f;

}int lowbit(int t)

void add(int

x,int data)

}int query(int

x) return tot;

}int main()

else

}return

0; }

1080 線段樹練習

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond description 一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求...

codevs1080線段樹練習(線段樹)

題目描述 description 一行n個方格,開始每個格仔裡都有乙個整數。現在動態地提出一些問題和修改 提問的形式是求某乙個特定的子區間 a,b 中所有元素的和 修改的規則是指定某乙個格仔x,加上或者減去乙個特定的值a。現在要求你能對每個提問作出正確的回答。1 n 100000,提問和修改的總數m...

Codevs 1080 線段樹練習

portal 這道題倒是點醒了我 樹狀陣列和線段樹不一樣 半小時前才學的概念傻傻分不清 主要思路是利用樹狀陣列儲存字首和,然後字首和相減得到區間和。線段樹的知識在藍書裡出現了,莫名其妙就從紫書公升級了?mark下我看的那篇部落格 這位也是厲害,用三種方法 include includeusing n...