A. Nastya and Rice
判断一下[n*(a-b),n*(a+b)]和[c-d,c+d]两个区间有没有相交
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, b) for (register int i = a; i <= b; i++) int n, a, b, c, d; int main() { int t; cin >> t; while (t--) { cin >> n >> a >> b >> c >> d; int flag = 0; if (n * (a + b) >= c - d && n * (a - b) <= c + d) flag = 1; puts(flag ? "YES" : "NO"); } }
B. Nastya and Door
滑动窗口统计一下最大个数,注意一下区间两端的peak不计入ans
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, b) for (register int i = a; i <= b; i++) int n, k, a[200010], ispeak[200010]; int cnt, l, ans; int main() { int t; cin >> t; while (t--) { cin >> n >> k; rep(i, 1, n) cin >> a[i]; rep(i, 2, n - 1) ispeak[i] = a[i] > a[i - 1] && a[i] > a[i + 1]; cnt = 0; l = 1; rep(i, 1, k) cnt += ispeak[i]; ans = cnt - ispeak[k]; rep(i, 2, n - k + 1) { cnt += ispeak[i + k - 1] - ispeak[i - 1]; if (cnt - ispeak[i + k - 1] - ispeak[i] > ans) { ans = cnt - ispeak[i + k - 1] - ispeak[i]; l = i; } } cout << ans + 1 << " " << l << endl; } }
C. Nastya and Strange Generator
从1-n填数,在i位置填数,下一个要么在 i+1 的位置填,要么在[1,i-1]之间填
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, b) for (register int i = a; i <= b; i++) int n, a[200010]; int main() { int t; cin >> t; while (t--) { cin >> n; rep(i, 1, n) cin >> a[i]; int tmp = 1, flag = 1; for (int i = n; i; i--) { if (tmp == a[i]) tmp++; else if (tmp < a[i]) tmp = a[i]; else if (a[i + 1] - a[i] != 1) { flag = 0; break; } } puts(flag ? "YES" : "NO"); } }