從陣列第乙個開始累加
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>q
則min(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;
之間的所有牛的身高比他們小,假設所有牛的身高為0,那麼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)
(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...