數列的字首和:
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]就是i這個位置變動的值
二維陣列的差分:ans=sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]
二維陣列的修改:用陣列c存修改資訊。在c[x1][y1]處加上a,在c[x2+1][y1]和c[x1][y2+1]處減a,在c[x2+1][y2+1]再加上a。
最後(i,k)位置上變化的數值就是c陣列在(i,k)位置的字首和。
題目:洛谷p1115 最大子段和
給出一段序列,選出其中連續且非空的一段使得這段和最大
解析:先求乙個字首和陣列a,列舉右端點,向左找到a[i]最小的端點
#includeusing namespace std;
const int maxn = 2e5 + 10;
typedef long long ll;
ll n,a[maxn],sum,ans,minn;
int main()
else minn = min(minn,a[i]);
}printf("%lld\n",ans);
return 0;
}
字首和 差分
有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 ...
字首和 差分
顧名思義 用某乙個陣列來記錄陣列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...
差分字首和
如果我給你一串長度為n的數列a1,a2,a3 an,再給出m個詢問,每次詢問給出l,r兩個數,要求給出區間 l,r 裡的數的和,你會怎麼做,若是沒有了解過字首和的人看到這道題的想法可能是對於m次詢問,我每次都遍歷一遍它給的區間,計算出答案,這樣子的方法固然沒錯,但是用了兩個迴圈,其時間複雜度達到了o...