1081 線段樹練習 2
阿新 • • 發佈:2017-05-08
success %d mar efault pad ios 正常 增加 tro
輸出描述 Output Description
1081 線段樹練習 2
codevs 1081
時間限制: 1 s 空間限制: 128000 KB 題目等級 : 大師 Master 題目描述 Description給你N個數,有兩種操作
1:給區間[a,b]的所有數都增加X
2:詢問第i個數是什麽?
第一行一個正整數n,接下來n行n個整數,再接下來一個正整數Q,表示操作的個數. 接下來Q行每行若幹個整數。如果第一個數是1,後接3個正整數a,b,X,表示在區間[a,b]內每個數增加X,如果是2,後面跟1個整數i, 表示詢問第i個位置的數是多少。
對於每個詢問輸出一行一個答案
樣例輸入 Sample Input3
1
2
3
2
1 2 3 2
2 3
樣例輸出 Sample Output5
數據範圍及提示 Data Size & Hint數據範圍
1<=n<=100000
1<=q<=100000
線段樹:區間增減 與 單點查詢。
但是不知道為什麽,有一組則是數據運行時輸出結果正常,但評測時,卻不正確。求解答
輸入數據 (顯示前20行)
5 2 3 1 4 5 2 1 1 1 1 2 1
你的答案
< 1
正確答案
> 3
本題來自codevs 1081
1 #include<iostream> 2 #include<cstdio> 3 #define lson l , m , rt << 1 4 #define rson m+1, r , rt << 1 | 1 5 #define LL long long 6 using namespace std; 7 8 constint N = 100010 ; 9 10 int add[N<<2]; 11 int sum[N<<2]; 12 int n,q; 13 14 void pushup(int rt) 15 { 16 sum[rt] = sum[rt<<1] + sum[rt<<1|1] ; 17 } 18 void pushdown(int rt,int m) //rt線段,m長度 19 { 20 if (add[rt]) 21 { 22 add[rt<<1] += add[rt]; 23 add[rt<<1|1] += add[rt]; 24 sum[rt<<1] += add[rt] * (m - (m >> 1)); 25 sum[rt<<1|1] += add[rt] * (m >> 1); 26 add[rt] = 0; 27 } 28 } 29 void build(int l,int r,int rt) 30 { 31 add[rt] = 0; 32 if (l == r) 33 { 34 scanf("%lld",&sum[rt]); 35 return ; 36 } 37 int m = (l + r) >> 1; 38 build(lson); 39 build(rson); 40 pushup(rt); 41 } 42 void update(int L,int R,int c,int l,int r,int rt) //[L,R]的區間加上c 43 { 44 if (L <= l && r <= R) 45 { 46 add[rt] += c; 47 sum[rt] += (LL)c * (r - l + 1); 48 return ; 49 } 50 pushdown(rt , r - l + 1); 51 int m = (l + r) >> 1; 52 if (L <= m) update(L , R , c , lson); 53 if (m < R) update(L , R , c , rson); 54 pushup(rt); 55 } 56 LL query(int x,int l,int r,int rt) 57 { 58 if (x==l && x==r) 59 { 60 return sum[rt]; 61 } 62 pushdown(rt , r - l + 1); 63 int m = (l + r) >> 1; 64 if (x <= m) return query(x , lson); 65 if (m < x) return query(x , rson); 66 } 67 int main() 68 { 69 scanf("%d",&n); 70 build(1,n,1); 71 scanf("%d",&q); 72 while(q--) 73 { 74 int a,b,x,y; 75 scanf("%d",&a); 76 if(a==1) 77 { 78 scanf("%d%d%d",&x,&y,&b); 79 update(x,y,b,1,n,1); 80 } 81 else 82 { 83 scanf("%d",&b); 84 printf("%lld\n",query(b,1,n,1)); 85 } 86 } 87 return 0; 88 }
1081 線段樹練習 2