1. 程式人生 > >(前綴和)51NOD 1081 子段求和

(前綴和)51NOD 1081 子段求和

spa 重新 指針 釋放內存 eof long ddr ext ()

給出一個長度為N的數組,進行Q次查詢,查詢從第i個元素開始長度為l的子段所有元素之和。 例如,1 3 7 9 -1,查詢第2個元素開始長度為3的子段和,1 {3 7 9} -1。3 + 7 + 9 = 19,輸出19。 Input
第1行:一個數N,N為數組的長度(2 <= N <= 50000)。
第2 至 N + 1行:數組的N個元素。(-10^9 <= N[i] <= 10^9)
第N + 2行:1個數Q,Q為查詢的數量。
第N + 3 至 N + Q + 2行:每行2個數,i,l(1 <= i <= N,i + l <= N)
Output
共Q行,對應Q次查詢的計算結果。
Input示例
5
1
3
7
9
-1
4
1 2
2 2
3 2
1 5
Output示例
4
10
16
19

前綴和算法:

#include <stdio.h>
#include <malloc.h>
int main()
{
    int n;
    while (scanf_s("%d", &n) != EOF)
    {
        int *p = (int *)alloca(n * sizeof(int)),q;
        long long *pt = (long long *)alloca((n + 1) * sizeof
(long long)); for (int i = 0; i < n; i++) { scanf_s("%d", p + i); pt[i + 1] = pt[i] + p[i]; } scanf_s("%d", &q); while (q--) { int i, l; scanf_s("%d%d", &i, &l); printf("%lld\n", pt[i+l-1
] - pt[i-1]); } } }

總結一些關於內存分配的知識點。

常見內存分為三大區域

1.靜態存儲區(全局變量,static類型的局部變量等)

內存區域大,2個G左右,2^28個字節。

2.棧(局部變量等)

內存區域小,1~2M,2^20個字節。處理速度快。

3.堆(動態內存分配)

內存區域大,2個G左右,2^28個字節。

動態內存分配的相關函數:

void *malloc(unsigned int num_bytes);(分配的內存是位於堆中的,並且沒有初始化內存的內容。)

void *calloc(unsigned n,unsigned size);(分配的內存是位於堆中的,並且初始化內存的內容。)

void *realloc(void *mem_address, unsigned int newsize);(先判斷當前的指針是否有足夠的連續空間,如果有,擴大mem_address指向的地址,並且將mem_address返回,如果空間不夠,先按照newsize指定的大小分配空間,將原有數據從頭到尾拷貝到新分配的內存區域,而後釋放原來mem_address所指內存區域,同時返回新分配的內存區域的首地址。即重新分配存儲器塊的地址。)

void *alloca(_In_ size_t _Size) (分配的內存是位於棧中的,並且初始化內存的內容,作用域結束時會自動釋放內存。)

void free(void* p);(釋放動態分配的內存。未被釋放的空間再次被無法使用。)

(前綴和)51NOD 1081 子段求和