第一題
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int T;
cin >> T;
for (int i = 0; i < T; i++) {
int n;
cin >> n;
vector<int> a(n, 0);
vector<int> b(n, 0);
vector<int> help(n, 0);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
help[i] = 1;
}
}
int start = -1;
int end = -1;
for (int i = 0; i < n; i++) {
if (start == -1 && help[i] == 1) {
start = i;//找到開頭的位置
end = i;
while (i + 1 < n && help[++i] == 1 && help[i] == help[i - 1]) {
end = i;
}
}
}
int k = a[start] - b[start];
int pEnd = -1;
for (int i = n - 1; i >= 0; i--) {
if (help[i] == 1) {
pEnd = i;
break;
}
}
if (end != pEnd)
{
cout << "NO" << endl;
}
else {
for (int i = start; i < end; i++) {
if (a[i] - b[i] != k) {
cout << "NO" << endl;
break;
}
}
cout << "YES" << endl;
}
}
}
第二題
int main() {
int n;
cin >> n;
vector<int> arr(n,0);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int ans = 0;
stack<int> st;
for (int i = n - 1; i >= 0; i--) {
if (!st.empty() && st.top() < arr[i]) {
int t = (arr[i] - 1) / st.top();
ans += t;
st.push(arr[i] / (t + 1));
continue;
}
st.push(arr[i]);
}
cout << ans << endl;
}
第三題
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n, 0);
vector<int> b(m, 0);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < m; i++) {
cin >> b[i];
}
sort(a.begin(), a.end());
sort(b.begin(), b.end());
//上一個商品使用的優惠券
int index = -1;
int cost = 0;
for (int i = 0; i < m; i++) {
while (index + 1 < n && a[index + 1] <= b[i])
index++;
cost += (b[i] - a[index]);
}
cout << cost << endl;
}
第四題
int main() {
//單調隊列問題
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int n;
cin >> n;
vector<int> heights(n, 0);
for (int i = 0; i < n; i++) {
cin >> heights[i];
}
vector<int> res(n, 0);
vector<int> left(n, 0);
vector<int> right(n, 0);
for (int i = n - 1; i >= 0; i--)
{
int j = i;
while (j >= 0 && heights[i] >= heights[j]) {
j--;
}
left[i] = j + 1;
}
for (int i = 0; i < n; i++) {
int j = i;
while (j < n && heights[i] >= heights[j]) {
j++;
}
right[i] = j - 1;
}
for (int i = 0; i < n; i++) {
cout << right[i] - left[i] << " ";
}
cout << endl;
}
}