[Codevs] 1082 线段树练习3
生活随笔
收集整理的這篇文章主要介紹了
[Codevs] 1082 线段树练习3
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1082 線段樹練習 3
?時間限制: 3 s ?空間限制: 128000 KB ?題目等級 : 大師 Master 題目描述?Description給你N個數,有兩種操作:
1:給區間[a,b]的所有數增加X
2:詢問區間[a,b]的數的和。
?
輸入描述?Input Description第一行一個正整數n,接下來n行n個整數,?
再接下來一個正整數Q,每行表示操作的個數,
如果第一個數是1,后接3個正整數,
表示在區間[a,b]內每個數增加X,如果是2,
表示操作2詢問區間[a,b]的和是多少。?
pascal選手請不要使用readln讀入
輸出描述?Output Description對于每個詢問輸出一行一個答案
樣例輸入?Sample Input3
1?2?3?
2
1?2 3 2
2 2 3
樣例輸出?Sample Output9
數據范圍及提示?Data Size & Hint數據范圍
1<=n<=200000
1<=q<=200000
?
分析 Analysis
分塊!
分塊除了細節難調外沒有什么問題,,,只要理解到位并且有自己的碼風即可。
更具體的分析:
[Codevs] 1081 線段樹練習 2 ----“分塊!”
?
代碼 Code
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #define maxn 1000000 5 using namespace std; 6 7 long long block[maxn],size,sum[maxn],add[maxn],arr[maxn],n,q,swi; 8 9 void modify(){ 10 long long a,b,c; 11 scanf("%lld%lld%lld",&a,&b,&c); 12 a--,b--; 13 14 for(long long i = a;i <= min(block[a]*size-1,b);i++) 15 arr[i] += c,sum[block[i]] += c; 16 if(block[a] != block[b]){ 17 for(long long i = (block[b]-1)*size;i <= b;i++) 18 arr[i] += c; 19 sum[block[b]] += (b-(block[b]-1)*size+1)*c; 20 }for(long long i = block[a]+1;i < block[b];i++) 21 sum[i] += size*c,add[i] += c; 22 } 23 24 void query(){ 25 long long a,b; 26 scanf("%lld%lld",&a,&b); 27 a--,b--; 28 long long ans = 0; 29 30 for(long long i = a;i <= min(block[a]*size-1,b);i++) 31 ans += arr[i]+add[block[i]]; 32 if(block[a] != block[b]){ 33 for(long long i = (block[b]-1)*size;i <= b;i++) 34 ans += arr[i]+add[block[i]]; 35 }for(long long i = block[a]+1;i < block[b];i++) 36 ans += sum[i]; 37 38 printf("%lld\n",ans); 39 } 40 41 int main(){ 42 scanf("%lld",&n); 43 size = (long long)sqrt(n)+1; 44 for(long long i = 0;i < n;i++) block[i] = i/size+1; 45 for(long long i = 0;i < n;i++) scanf("%lld",&arr[i]); 46 for(long long i = 0;i < n;i++) sum[block[i]] += arr[i]; 47 48 scanf("%lld",&q); 49 for(long long i = 0;i < q;i++){ 50 scanf("%lld",&swi); 51 if(swi%2) modify(); 52 else query(); 53 } 54 55 return 0; 56 } 分塊!?
轉載于:https://www.cnblogs.com/Chorolop/p/7512398.html
總結
以上是生活随笔為你收集整理的[Codevs] 1082 线段树练习3的全部內容,希望文章能夠幫你解決所遇到的問題。