作业介绍

差分数组  : 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 小时