顧名思義:用某乙個陣列來記錄陣列a前i項和,這個還可以用來求區間[l,r]的和:s[r]-s[l-1](因為第l項也在區間內)
話不多說,直接上例題:leetcode 5393
ac**:
const
int maxn =
1e5+5;
class
solution
int ans =0;
for(
int i =
0;i <= k;
++i)
return ans;}}
;
傳送門:洛谷p3397
下面貼下ac**(後面有利用差分的優化):
#include
#include
#include
using
namespace std;
const
int maxn =
1000+5
;int n,m;
int ans[maxn]
[maxn]
;int
main
(void)}
for(
int x =
1;x <= n;
++x)
printf
("\n");
}return0;
}
#include
#include
#include
using
namespace std;
const
int maxn =
1000+5
;int n,m;
int ans[maxn]
[maxn]
,p[maxn]
[maxn]
;int
main
(void)}
for(
int x =
1;x <= n;
++x)
printf
("\n");
}return0;
}
ac**:
#include
#include
#include
#include
#define ll long long
using
namespace std;
const
int maxn =
1e5+5;
ll a[maxn]
,b[maxn]
,c[maxn]
,times[maxn]
,city[maxn]
;int n,m;
intmain
(void
)else
if(city[i]
> city[i-1]
)}ll ans =0;
for(
int i =
1;i < n;
++i)
cout << ans;
return0;
}
字首和 差分
數列的字首和 sum i 表示a 1 a i 的和 用處1 求i j的和sum j sum i 1 用處2 區間修改。設定乙個change陣列。當區間 i,j 上要加k時,我們令change i k,令change j 1 k。如果我們對change陣列求字首和的話,字首和sum change i ...
字首和 差分
有n個數和q次操作,每一次操作指明了要操作的區間 l,r 以及讓該區間內的所有元素全部加c 輸出q次操作後所有元素的大小 第一行 n q 1 n,q 2 105 第二行 n個數 a1,a2 an 106 ai 106 接下來q 行 每行3個數 l r c 表示 l,r 區間內每個數加c 1 l r ...
差分字首和
如果我給你一串長度為n的數列a1,a2,a3 an,再給出m個詢問,每次詢問給出l,r兩個數,要求給出區間 l,r 裡的數的和,你會怎麼做,若是沒有了解過字首和的人看到這道題的想法可能是對於m次詢問,我每次都遍歷一遍它給的區間,計算出答案,這樣子的方法固然沒錯,但是用了兩個迴圈,其時間複雜度達到了o...