1. 程式人生 > 其它 >acwing演算法第二課

acwing演算法第二課

一、高精度加法--A+B    106

  大整數從個位(小位)開始存在數組裡

// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        
if (i < B.size()) t += B[i]; C.push_back(t % 10); t /= 10; } if (t) C.push_back(t); return C; } 作者:yxc 連結:https://www.acwing.com/blog/content/277/ 來源:AcWing 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

二、高精度減法

  和加法差不多,但要先判斷A是否大於B,要分情況討論。

 1 vector<int> sub(vector<int> &A, vector<int
> &B) 2 { 3 vector<int> C; 4 for (int i = 0, t = 0; i < A.size(); i ++ ) 5 { 6 t = A[i] - t; 7 if (i < B.size()) t -= B[i]; 8 C.push_back((t + 10) % 10); 9 if (t < 0) t = 1; 10 else t = 0; 11 } 12 13 while (C.size() > 1
&& C.back() == 0) C.pop_back(); 14 return C; 15 } 16 17 作者:yxc 18 連結:https://www.acwing.com/blog/content/277/ 19 來源:AcWing 20 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

三、高精度乘法

  高精度乘低精度:

 1 // C = A * b, A >= 0, b >= 0
 2 vector<int> mul(vector<int> &A, int b)
 3 {
 4     vector<int> C;
 5 
 6     int t = 0;
 7     for (int i = 0; i < A.size() || t; i ++ )
 8     {
 9         if (i < A.size()) t += A[i] * b;
10         C.push_back(t % 10);
11         t /= 10;
12     }
13 
14     while (C.size() > 1 && C.back() == 0) C.pop_back();
15 
16     return C;
17 }
18 
19 作者:yxc
20 連結:https://www.acwing.com/blog/content/277/
21 來源:AcWing
22 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

四、高精度除法

  高精度除以低精度:

 

 

 1 // A / b = C ... r, A >= 0, b > 0
 2 vector<int> div(vector<int> &A, int b, int &r)
 3 {
 4     vector<int> C;
 5     r = 0;
 6     for (int i = A.size() - 1; i >= 0; i -- )
 7     {
 8         r = r * 10 + A[i];
 9         C.push_back(r / b);
10         r %= b;
11     }
12     reverse(C.begin(), C.end());
13     while (C.size() > 1 && C.back() == 0) C.pop_back();
14     return C;
15 }
16 
17 作者:yxc
18 連結:https://www.acwing.com/blog/content/277/
19 來源:AcWing
20 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

 

 如何將高精度整數以字串寫入,再讀到陣列中:

 

五、字首和

  一維:

S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]

  二維:

S[i, j] = 第i行j列格子左上部分所有元素的和
以(x1, y1)為左上角,(x2, y2)為右下角的子矩陣的和為:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]

六、差分

  一維:

給區間[l, r]中的每個數加上c:B[l] += c, B[r + 1] -= c
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const int N = 100010;
 6 
 7 int n, m;
 8 int a[N], b[N];
 9 
10 void insert(int l, int r, int c)
11 {
12     b[l] += c;
13     b[r + 1] -= c;
14 }
15 
16 int main()
17 {
18     scanf("%d%d", &n, &m);
19     for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
20 
21     for (int i = 1; i <= n; i ++ ) insert(i, i, a[i]);
22 
23     while (m -- )
24     {
25         int l, r, c;
26         scanf("%d%d%d", &l, &r, &c);
27         insert(l, r, c);
28     }
29 
30     for (int i = 1; i <= n; i ++ ) b[i] += b[i - 1];
31 
32     for (int i = 1; i <= n; i ++ ) printf("%d ", b[i]);
33 
34     return 0;
35 }
36 
37 作者:yxc
38 連結:https://www.acwing.com/activity/content/code/content/39799/
39 來源:AcWing
40 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

  

  二維:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const int N = 1010;
 6 
 7 int n, m, q;
 8 int a[N][N], b[N][N];
 9 
10 void insert(int x1, int y1, int x2, int y2, int c)
11 {
12     b[x1][y1] += c;
13     b[x2 + 1][y1] -= c;
14     b[x1][y2 + 1] -= c;
15     b[x2 + 1][y2 + 1] += c;
16 }
17 
18 int main()
19 {
20     scanf("%d%d%d", &n, &m, &q);
21 
22     for (int i = 1; i <= n; i ++ )
23         for (int j = 1; j <= m; j ++ )
24             scanf("%d", &a[i][j]);
25 
26     for (int i = 1; i <= n; i ++ )
27         for (int j = 1; j <= m; j ++ )
28             insert(i, j, i, j, a[i][j]);
29 
30     while (q -- )
31     {
32         int x1, y1, x2, y2, c;
33         cin >> x1 >> y1 >> x2 >> y2 >> c;
34         insert(x1, y1, x2, y2, c);
35     }
36 
37     for (int i = 1; i <= n; i ++ )
38         for (int j = 1; j <= m; j ++ )
39             b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
40 
41     for (int i = 1; i <= n; i ++ )
42     {
43         for (int j = 1; j <= m; j ++ ) printf("%d ", b[i][j]);
44         puts("");
45     }
46 
47     return 0;
48 }
49 
50 作者:yxc
51 連結:https://www.acwing.com/activity/content/code/content/39800/
52 來源:AcWing
53 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

淺淺記錄一下y總的課,順便搞個板子。