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