le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Sommario
[Modello] Somma del prefisso unidimensionale
[Modello] Somma del prefisso bidimensionale
Trova l'indice centrale di un array
Prodotto di array diversi da sé
Se usiamo una soluzione di forza bruta,L'array deve essere attraversato ogni volta, per un totale di q volte,COSÌcomplessità temporaleè troppo alto, in questo momento costruiamo un array di somme di prefissi suLa somma di ciascun intervallo all'interno dell'intervallo 1-n viene memorizzata in , sono necessari i primi n elementi e l'accesso diretto al prefisso dp e alla posizione del pedice dell'array. codice mostrato come di seguito:
- #include<iostream>
- #include<vector>
- using namespace std;
-
- int main()
- {
- // 读入数据
- int n, q; cin >> n >> q;
- // n + 1 添加了虚拟节点0
- vector<int> arr(n + 1); // 默认全部为0
- for (int i = 1; i <= n; i++)
- cin >> arr[i];
-
- // 预处理出一个前缀和数组
- vector<long long> dp(n + 1); // 防止溢出
- for (int i = 1; i <= n; i++)
- dp[i] = dp[i - 1] + arr[i];
-
- // 使用前缀和数组
- int l = 0, r = 0;
- while (q--)
- {
- cin >> l >> r;
- cout << dp[r] - dp[l - 1] << endl;
- }
- return 0;
- }
preelaborazioneuna matrice di somma dei prefissi che lo faràLa somma di tutti gli elementi dalle posizioni (1, 1) a (i, j).esiste in questo array dp, throughMetodo di calcolo dell'area, per trovare la risposta definitiva, il codice è il seguente:
- int main()
- {
- // 读入数据
- int n, m, q; cin >> n >> m >> q;
- vector<vector<int>> arr(n + 1, vector<int>(m + 1));
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= m; j++)
- cin >> arr[i][j];
-
- // 预处理一个前缀和数组
- vector<vector<long long>> dp(n + 1, vector<long long>(m + 1)); // 防止溢出
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= m; j++)
- dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];
-
- // 使用前缀和数组
- while (q--)
- {
- int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2;
- cout << dp[x2][y2] - dp[x2][y1 - 1] - dp[x1 - 1][y2] + dp[x1 - 1][y1 - 1] << endl;
- }
- return 0;
- }
Nota i casi limite quiNon è necessario aprire n+1 prefisso di spazio e array, perché c'è un elemento nell'array originale che dovrebbe essere utilizzato come pedice centrale di questa domanda. Il codice è il seguente:
- class Solution {
- public:
- int pivotIndex(vector<int>& nums) {
- int n = nums.size();
- vector<int> f(n), g(n);
- // 预处理前缀和数组 从左向右
- for (int i = 1; i < n; i++)
- f[i] = f[i - 1] + nums[i - 1];
- // 预处理后缀和数组 从右向左
- for (int i = n - 2; i >= 0; i--)
- g[i] = g[i + 1] + nums[i + 1];
- for (int i = 0; i < n; i++)
- {
- if (g[i] == f[i])
- return i;
- }
- return -1;
- }
- };
Il significato è simile alla domanda precedente, ma va notato che i casi limite f(0) e g(n-1) dovrebbero essere inizializzati a 1 invece che a 0. Il codice è il seguente:
- class Solution {
- public:
- vector<int> productExceptSelf(vector<int>& nums) {
- int n = nums.size();
- vector<int> f(n), g(n), ret(n);
- // 处理边界情况
- f[0] = 1; g[n - 1] = 1;
- // 预处理前缀积数组 从左向右
- for (int i = 1; i < n; i++)
- f[i] = f[i - 1] * nums[i - 1];
- // 预处理后缀积数组 从右向左
- for (int i = n - 2; i >= 0; i--)
- g[i] = g[i + 1] * nums[i + 1];
- for (int i = 0; i < n; i++)
- ret[i] = f[i] * g[i];
- return ret;
- }
- };
Nota: il prefisso e l'array bidimensionali devono avere un'altra riga e una colonna, altrimenti si verificherà un accesso fuori dai limiti. Inoltre, gli indici devono essere regolati tra l'array dp e l'array ans per corrispondere alle posizioni. ans[ 0 ][ 0 ] corrisponde a dp [ 1 ][ 1] questa posizione. codice mostrato come di seguito:
- class Solution {
- public:
- vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
- int m = mat.size(), n = mat[0].size(); // m 为行 n 为列
- // 预处理一个二维前缀和数组 dp
- vector<vector<int>> dp(m + 1, vector<int>(n + 1));
- for (int i = 1; i <= m; i++)
- for (int j = 1; j <= n; j++)
- dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + mat[i - 1][j - 1] - dp[i - 1][j - 1];
- // 存放答案的二维数组 ans
- vector<vector<int>> ans(m, vector<int>(n));
- for (int i = 0; i < m; i++)
- {
- for (int j = 0; j < n; j++)
- {
- int x1 = max(0, i - k) + 1, y1 = max(0, j - k) + 1;
- int x2 = min(m - 1, i + k) + 1, y2 = min(n - 1, j + k) + 1;
- ans[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
- }
- }
- return ans;
- }
- };