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...