Codevs 1080 線段樹練習

2022-02-13 09:44:28 字數 2911 閱讀 4029

1080 線段樹練習

時間限制: 1 s

空間限制: 128000 kb

題目等級 :鑽石 diamond

傳送門題目描述 description

一行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]之間的區間和。

輸出描述 output description

共m行,每個整數

樣例輸入 sample input

6 4

5 6

2 1

3 4

1 3 5

2 1 4

1 1 9

2 2 6

樣例輸出 sample output

22 22

資料範圍及提示 data size & hint

1≤n≤100000, m≤10000 。

/*

最裸線段樹(閉區間版).

支援單點修改+區間求和.

*/#include

#include

#define maxn 100001

using

namespace

std;

struct data

tree[maxn*4];

int n,m,cut,aa[maxn+10];

void bluid(int l,int r)//建樹

int mid=(l+r)>>1;

tree[k].lc=cut+1;

bluid(l,mid);

tree[k].rc=cut+1;

bluid(mid+1,r);

tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;

}void add(int k,int x,int add1)//單點修改

}int query(int k,int ll,int rr)//區間求和

int tot=0;

int mid=(tree[k].l+tree[k].r)>>1;

if(ll<=mid) tot+=query(tree[k].lc,ll,rr);

if(rr>mid) tot+=query(tree[k].rc,ll,rr);

return tot;

}int main()

bluid(1,n);

scanf("%d",&m);

for(int i=1;i<=m;i++)

else

}return

0;}

/*

最裸線段樹(開區間版).

支援單點修改+區間求和.

*/#include

#include

#define maxn 100001

using

namespace

std;

struct data

tree[maxn*4];

int n,m,cut,aa[maxn+10];

void bluid(int l,int r)//建樹

int mid=(l+r)>>1;

tree[k].lc=cut+1;

bluid(l,mid);

tree[k].rc=cut+1;

bluid(mid,r);

tree[k].sum=tree[tree[k].lc].sum+tree[tree[k].rc].sum;

}void add(int k,int x,int add1)//單點修改

}int query(int k,int ll,int rr)//區間求和

int tot=0;

int mid=(tree[k].l+tree[k].r)>>1;

if(llif(rr>mid) tot+=query(tree[k].rc,ll,rr);

return tot;

}int main()

bluid(1,n+1);

scanf("%d",&m);

for(int i=1;i<=m;i++)

else

}return

0;}

/*

樹狀陣列 單點修改 區間求和.

比線段樹不知道要快到那裡去.

*/#include

#include

#define maxn 100001

ints[maxn],n,x,y,m,z;

intread()

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

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

return

x*f;

}int lowbit(int t)

void add(int t,intx)}

int query(int

x) return tot;

}int main()

m=read();

for(int i=1;i<=m;i++)

return

0;}

Codevs 1080 線段樹練習

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

Codevs1080 線段樹練習

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

codevs1080線段樹練習(線段樹)

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