作业介绍
差分数组 : d[i][j] = a[i][j] -a[i-1][j] - a[i][j-1] + a[i-1][j-1]
还原 : a[i][j] = d[i][j] + a[i-1][j] + a[i][j-1] - a[i-1][j-1]
修改区间 [x1,y1] [x2 , y2] 增加 K
d[x1][y1] +=k
d[x1][y2+1] -=k
d[x2+1][y1] -= k
d[x2+1][y2+1] +=k
差分
d[i] = a[i] - a[i-1]
原来数组 : 1 2 3 4 5
差分数组 : 1 1 1 1 1
修改[1,3]+1: 2 3 4 4 5
差分数组: 2 1 1 0 1
差分数组前后的变化:d[1]+=1 , d[4]-=1
修改[l,r] 区间增加 x, d[l]+=x , d[r+1]-=x
还原原数组: a[i] = d[i] + a[i-1]
二维前缀和
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j]
区间和
(x,y) 到 (i,j) 围起来的区间的和
s[i][j] - s[i][y-1] - s[x-1][j-1] + s[x-1][y-1
s[i] = a[1]+a[2]+... + a[i-1]+ a[i]
s[i-1] = a[1] +a[2] +...+ a[i-1]
前缀和公式 s[i] = s[i-1] + a[i]
区间和 a[l]+a[l+1] + ... + a[r]
s[r] = a[1] +... + a[l-1] + a[l]+a[l+1] + ... + a[r]
s[l-1] = a[1] + ... + a[l-1]
区间和 [l,r] = s[r] - s[l-1]
#include <bits/stdc++.h>
using namespace std;
int a, b, n;
int main() {
cin >> a >> b >> n;
int r = a % b;
cout << a / b << ".";
for (int i = 1; i <= n; i++) {
r = r * 10;
cout << r / b;
r = r % b;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
vector<int> A, B;
string a, b;
vector<int> mult(vector<int> &A, vector<int> &B) {
vector<int> C(A.size() + B.size() + 10, 0);
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < B.size(); j++)
C[i + j] += A[i] * B[j];
// 处理进位
int t = 0;
for (int i = 0; i < C.size() || t; i++) {
t += C[i];
C[i] = t % 10;
t /= 10;
}
// 会有前导 0 ,之前 C 没有用的位置
while (C.size() > 1 && C.back() == 0)
C.pop_back();
reverse(C.begin(), C.end());
return C;
}
int main() {
cin >> a >> b;
for (char c : a)
A.push_back(c - '0');
reverse(A.begin(), A.end());
for (char c : b)
B.push_back(c - '0');
reverse(B.begin(), B.end());
auto C = mult(A, B);
for (int c : C)
cout << c;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
vector<int> A, C;
int b, r; // r 表示余数
string a;
void div(vector<int> &A, int b) {
r = 0;
for (int i = 0; i < A.size(); i++) {
r = r * 10 + A[i];
C.push_back(r / b);
r = r % b;
}
// 去除前导 0
while (C.size() > 1 && C[0] == 0)
C.erase(C.begin());
}
int main() {
cin >> a >> b;
for (auto t : a)
A.push_back(t - '0');
div(A, b);
for (auto t : C)
cout << t;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
string a;
int b;
vector<int> A, B;
vector<int> C;
void mul(vector<int> &A, int b) {
int t = 0;
for (int i = 0; i < A.size() || t ; i++) {
t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
}
int main() {
cin >> a >> b;
if (b == 0) {
cout << 0;
return 0;
}
// 从低位到高位拆出来
for (int i = a.size() - 1 ; i >= 0 ; i--)
A.push_back(a[i] - '0');
mul(A, b);
reverse(C.begin(), C.end());
for (int t : C)
cout << t;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
string a, b;
vector<int> A, B;
vector<int> C;
// A > B 返回1, 否则返回 0
bool cmp(vector<int> &A, vector<int> &B) {
if (A.size() != B.size())
return A.size() > B.size();
// 按位比
for (int i = A.size() - 1; i >= 0; i--) {
if (A[i] == B[i])
continue;
return A[i] > B[i];
}
}
// 统一是大减小
void sub(vector<int> &A, vector<int> &B) {
int t = 0;
for (int i = 0; i < A.size(); i++) {
t = A[i] - t; // 处理借位
if (i < B.size())
t = t - B[i];
if (t < 0)
C.push_back(t + 10), t = 1;
else
C.push_back(t), t = 0;
}
// 去除前导 0 , 高位是在尾部
while (C.size() > 1 && C.back() == 0)
C.pop_back();
}
int main() {
cin >> a >> b;
if (a == b) {
cout << 0;
return 0;
}
// 从低位到高位拆出来
for (int i = a.size() - 1 ; i >= 0 ; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1 ; i >= 0 ; i--)
B.push_back(b[i] - '0');
if (cmp(A, B)) {
sub(A, B);
reverse(C.begin(), C.end());
for (int c : C)
cout << c;
} else {
cout << "-";
sub(B, A);
reverse(C.begin(), C.end());
for (int c : C)
cout << c;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
string a, b;
vector<int> A, B;
vector<int> C;
void add(vector<int> &A, vector<int> &B) {
int t = 0; // 存储进位
for (int i = 0, j = 0; i < A.size() || j < B.size() ; i++, j++) {
if (i < A.size())
t += A[i];
if (j < B.size())
t += B[i];
C.push_back(t % 10);
t /= 10;
}
if (t)
C.push_back(1);
}
int main() {
cin >> a >> b;
// 从低位到高位拆出来
for (int i = a.size() - 1 ; i >= 0 ; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1 ; i >= 0 ; i--)
B.push_back(b[i] - '0');
add(A, B);
reverse(C.begin(), C.end()); // 翻转
for (int c : C)
cout << c;
return 0;
}
题目
认领作业后才可以查看作业内容。
- 状态
- 正在进行…
- 题目
- 21
- 开始时间
- 2026-6-26 0:00
- 截止时间
- 2026-8-31 23:59
- 可延期
- 24 小时