A. AtCoder Line
判断 \(z\) 是否出现在 \(x\) 和 \(y\) 之间即可
代码实现
n, x, y, z = map(int, input().split())
if x > y:
x, y = y, x
if x < z < y:
print('Yes')
else:
print('No')
B.Typing
模拟
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
int main() {
string s, t;
cin >> s >> t;
int si = 0;
rep(i, t.size()) {
if (s[si] == t[i]) {
cout << i+1 << ' ';
si++;
}
}
return 0;
}
C. Standing On The Shoulders
\(\sum a +\max(b_i-a_i)\)
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
int main() {
int n;
cin >> n;
vector<int> a(n), b(n);
rep(i, n) cin >> a[i] >> b[i];
int mx = 0;
rep(i, n) mx = max(mx, b[i]-a[i]);
ll ans = mx;
rep(i, n) ans += a[i];
cout << ans << '\n';
return 0;
}
D. Permutation Subsequence
可以开一个数组 q
用来记录数 \(p_i\) 所对应的下标
维护一个大小为 \(k\) 且数值连续的滑动窗口,我们需要快速找到这个窗口中的每个数所对应的下标数组的最大值和最小值,这个可以用 std::set
的 begin()
和 rbegin()
实现
代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> p(n);
rep(i, n) cin >> p[i];
rep(i, n) p[i]--;
vector<int> q(n);
rep(i, n) q[p[i]] = i;
int ans = n;
set<int> st;
rep(i, n) {
st.insert(q[i]);
if (st.size() > k) st.erase(q[i-k]);
if (st.size() == k) {
int now = *st.rbegin() - *st.begin();
ans = min(ans, now);
}
}
cout << ans << '\n';
return 0;
}