字首和與差分

2021-09-17 21:36:57 字數 2813 閱讀 1159

從陣列第乙個開始累加

s[i]=s[i-1]+a[i]
求區間[l,r]的和,o(1)複雜度sum=s[r]-s[l-1]

遞推s[i][j]=s[i][j]-s[i-1][j]-s[i][j-1]+s[i-1][j-1]

例題:雷射炸彈
一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n(n≤10000)個目標,用整數xi,yi(0≤xi,yi≤5000)表示目標在地圖上的位置,每個目標都有乙個價值0<vi<100。雷射炸彈的投放是通過衛星定位的,但其有乙個缺點,就是其爆破範圍,即那個邊長為r的正方形的邊必須和x,y軸平行。若目標位於爆破正方形的邊上,該目標將不會被摧毀

將點向右下移動一次就可解決邊界不包括的點

給出乙個5000×5000的矩陣,每個格仔上都有權值,求用乙個n×n的框最多能框住多少?

用字首和來求n*n的框的價值

value=s[i][j]+s[i-r][j]+s[i][j-r]-s[i-r][j-r]);

#include#include#includeusing namespace std;

const int maxn=5005;

int s[maxn][maxn];

int main()

for(int i=1;i<=n;i++)

for(int i=1;i<=5001;i++)

}int ans=0;

for(int i=r;i<=5001;i++)

}cout《差分與字首和是一種互逆的運算

陣列21

465字首和23

71318差分2-1

32-1

結論題

incdec sequence(inc序列)

給定乙個長度為n(n<=105

10^5

105)的數列,每次選擇區間 [l,r],使區間內的數加1或減1.

求最少需要多少次操作使的數列中所有的數都一樣,並且數列可能有幾種?

區間操作放在差分陣列中就是改變2個陣列的值,目標是,差分陣列b

2b_2

b2​~b

nb_n

bn​都為0,且數列最終由n個b

1b_1

b1​組成的,那麼不同的b

1b_1

b1​出現的次數代表了不同的數列

四種操作 設b

2b_2

b2​~b

nb_n

bn​正數總和p,負數絕對值總和q,(原則是走最少),第一步走min(q,p),剩下|q-p|個正數或者負數,

剩下的|p-q|執行2,3操作,那麼恰好為|p-q|次

操作次數ans=min(q,p)+|q-p|

min(p,q)+|q-p|=max(q,p)
證明

p>qmin(p,q)=q|q-p|=p-q得到ans=q+p-q=p

p=max(p,q)同理p

數列個數

b

1b_1

b1​一開始為1種,若2,3操作都為2操作,最多可能有|p-q|+1

#include#includeusing namespace std;

const int maxn=pow(10,5)+1;

int a[maxn];

int b[maxn];

int main()

// for(int i=1;i<=n;i++)

// cout<0) sum_1+=b[i];

else sum_2+=b[i];//0無所謂

}cout<<"操作次數"<tallest cow 最高奶牛poj3263

大意:n頭牛站成一行,當且僅當2頭牛之間所有牛都比它們矮,2頭牛能相互看見,一直第p頭牛最高,高為h,剩餘n-1頭牛不知道,給出m對關係(2頭牛能夠相互看見),求每頭牛的最大可能身高?(1<=n,m<=104

10^4

104,1<=h<=106

10^6

106)

思路:因為i,j,兩頭牛能夠相互看見,那麼(i-1)~(j-1)之間的所有牛的身高比他們小,假設所有牛的身高為0,那麼(i-1)~(j-1)之間牛的身高都-1,即b[i+1]-=1 b[j]+=1最後通過字首和求出原陣列,每頭牛可能的最高身高=h+a[i]

#include#includeusing namespace std;

const int maxn=10005;

int a[maxn];

int b[maxn];

map,bool> e;

int main()

}for(int i=1;i<=n;i++)

return 0;

}

字首和與差分

數列的字首和 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 ...

字首和與差分

例題入口 include const int n 320 int a n n a i 1 a i 0 1.對a 求出平方數 將其值置為1 不是平方數就是0 2.對a求乙個字首和 3.對 a,b 求乙個部分和 int sum n n void init for int i 1 i 100000 i i...

字首和與差分

include using namespace std const int n 1010 int a n n sum n n intmain int x1,y1,x2,y2 while q return0 差分就是資料間的差。是原始陣列的相鄰元素之間的差值,有b i a i 1 a i includ...