字首和常見的三種情況

2021-10-09 17:00:52 字數 2678 閱讀 4789

s[i] 為 陣列a 前i個元素的和

s[i] = a[0]+ … + a[i]

s[i] = s[i-1] + a[i]

異或字首和:

s[i] 為 陣列a 前i個元素的異或和

s[i] = s[i-1] xor a[i]

p2004 領地選擇

題意理解:

有乙個n x m的地圖,地圖上的每乙個點都有乙個值,求占地c x c 正方形裡值的和最大

思路:用sum[a][b]來記錄 從[0][0]到[a][b]範圍內的值之和,即二維字首和。

邊讀邊存

sum[i][j] += sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+data;

當讀到的i,j >c 時。

開始判斷以(i,j)為右下角座標的c x c正方形的值和是不是最大的

即:summax = max(summax,sum[i][j] - sum[i-c][j] - sum[i][j-c] + sum[i-c][j-c]);

知識點如:求區間[a][b] —— [i][j]範圍內的值 (i>a && j>b)

= sum[i][j] - sum[a][j] - sum[i][b] + sum[a][b]

code:

#includeint sum[1009][1009];

int n,m,c;

int maxs=-1e9;

int maxi = 0;

int maxj = 0;

int main()

}} }

printf("%d %d\n",maxi,maxj);

return 0;

}

p3406 海底高鐵

題意理解:

對於一條路線,要經過m個城市(可能有重複的城市),城市只有i-1 i i+1 相鄰,對於相鄰倆個城市i和i+1之間的路段,設走過這條路有ni次,要麼付ci + ni * bi 要麼付ai * ni;

就是乙個選擇問題,首先得知道每個路段會經過多少次。但是如果對於2號城市到10000號城市,每次都用迴圈去累加次數,會次數過多。

這裡可以用到差分的思想。

對於l 到 r之間和

只需要記錄ton[l] 和 ton[r]就行

即:ton[l]++;

ton[r]–;

然後通過字首和再求得中間的值:

for i = l+1;i<=r;i++

ton[l] = ton[l-1] + ton[i];

用p[i]來記錄第i段路

code:

#includeconst int imax = 100009;

long long n,m;

long long p[imax];

long long a[imax],b[imax],c[imax];

int ton[imax];

long long ans = 0;

int main()

else

} }for(int i = 1;i0)

else

} }

printf("%lld",ans);

return 0;

}

p2671 求和

題意理解:

有m個顏色總數,n個格仔

求所有的倆元組(x,z)

(x+z) * (number_x +number_z)

的和思路:

分類討論,對於顏色為x,i為奇數的格仔

如果有n個,

那麼就有

假設1 3 5 7格仔的顏色相同

(1+3)*(number_1+number_3)+ (1+5) * (number_1+number_5) + (1+7) * (number_1+number_7)

(3+5) * (number_3+number_5) + (3+7) * (number_3+number_7)

(5+7) * (number_5+number_7)

從上面發現,我們可以把所有的項拆開來

可以發現

對於i*number_i

i*nui * (colorx-2)

對於i*number_j

i* sumx

再把i提出來

則對於i

i *(nui * (colorx-2) + sumx )

公式拆開發現並不是巧合,

則可以得到乙個可以利用字首和簡化運算的操作:

for(i=1;i<=7;i+=2)
code:

#includeint n,m;

int sum[100009][2];

int color[100009][2];

int c[100009];

int nu[100009];

int ans = 0;

int main()

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

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

printf("%d",ans);

return 0;

}

C const 指標和常量的三種情況

1.指向常量的指標 includeint main void 其中 name zhang 可以執行 name 0 a 報錯,因為 name是乙個指向xie這個字串常量的指標變數,所以不能改變name的值,但是可以改變指標所指向的位址 2.常指標 includeint main void 其中name...

mysql三種引擎 MySQL常見的三種儲存引擎

簡單來說,儲存引擎就是指表的型別以及表在計算機上的儲存方式。儲存引擎的概念是mysql的特點,oracle中沒有專門的儲存引擎的概念,oracle有oltp和olap模式的區分。不同的儲存引擎決定了mysql資料庫中的表可以用不同的方式來儲存。我們可以根據資料的特點來選擇不同的儲存引擎。在mysql...

mysql三種引擎 MySQL常見的三種儲存引擎

原文連線 簡單來講,儲存引擎就是指表的型別以及表在計算機上的儲存方式。資料庫 儲存引擎的概念是mysql的特色,oracle中沒有專門的儲存引擎的概念,oracle有oltp和olap模式的區分。不一樣的儲存引擎決定了mysql資料庫中的表能夠用不一樣的方式來儲存。咱們能夠根據資料的特色來選擇不一樣...