本題會給你一段長度為n的整數序列,並進行k次詢問。每次詢問要求你給出區間a到b的和(序列下標由1到n)。由於區間和可能較大,請你輸出它對10000019取模的結果。
(注意:如果你想不到高效的做法,可以用樸素演算法得到一部分分,但本題滿分需要你用乙個比較高效的做法。)
輸入格式:
首先一行整數n,代表序列長度。
接下來一行n個整數,為序列內容。
接下來一行整數k,代表對區間和的詢問次數。
接下來k行,每行兩個整數a和b,請你輸入序列的第a到b號元素(含)的和取模後的結果。
輸出格式:
一共k行,每行乙個整數,代表詢問的區間和取模後的結果。
輸入樣例:
在這裡給出一組輸入。例如:
51 2 3 4 5
31 5
2 33 3
輸出樣例:
在這裡給出相應的輸出。例如:155
3資料限制:
n<=10
6
k<=10
5低效演算法
#include
using
namespace std;
intmain()
scanf
("%d"
,&k)
;for
(i=1
;i<=k;i++
)printf
("%d\n"
,sum%
10000019);
}return0;
}
高效演算法,應用字首和,輸入直接算出前邊資料的和,後邊輸出查詢兩次做差即可
#include
using
namespace std;
intmain()
;for
(i=1
;i<=n;i++
)scanf
("%d"
,&k)
;for
(i=1
;i<=k;i++
)return0;
}
求區間和問題(水題)
題目意思很明確,求某段區間和。資料結構選擇 陣列 方法思路 1 最直接的方法就是對於每次詢問的區間 a,b 從s a 1 疊加到s b 1 但是考慮到這種方法,對於每次詢問都要重新疊加。時間複雜度為o n n 超時。2 考慮到每次都要重新疊加。可以選擇用陣列sum的第k項來儲存前k項和。對於區間 a...
樹狀陣列求元素值和區間和
求單個位置的值可以用樹狀陣列保留字首和 include include include include using namespace std define maxn 100005 int f maxn int n int m int lowbit int x void add int x,int ...
線段樹(一)建樹 求區間和
線段樹是一種二叉樹,可以快速的查詢區間和,解決區間類問題 節點i,左邊界l,有邊界r,區間和的值tree i tree i 1 tree i 1 1 左兒子節點下標i 1,左邊界l,右邊界l r l 1 右兒子節點下標i 1 1,左邊界l r l 1 1,右邊界r 因為每個節點i的左右邊界已經確定,...