A
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n;
for (int i = n << 2, j = 1; j <= n; ++j, i -= 2) cout << i << ' ';
cout << '
';
}
return 0;
}
B
int main() {
IOS;
for (cin >> _; _; --_) {
ll a, b; string s; cin >> a >> b >> s;
ll ans = 0;
for (int i = 0, j = -1; i < s.size(); j = i - 1) {
while (i < s.size() && s[i] == '0') ++i;
if (i == s.size()) break;
if (j >= 0) ans += min(a, (i - j - 1) * b);
else ans += a;
while (i < s.size() && s[i] == '1') ++i;
}
cout << ans << '
';
}
return 0;
}
C
二分
PLL a[N];
bool check(int t) {
ll c = 0;
rep (i, 1, n) {
if (a[i].fi <= t) continue;
else c += a[i].se;
if (c > t) break;
}
return c <= t;
}
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n;
rep (i, 1, n) cin >> a[i].fi;
rep (i, 1, n) cin >> a[i].se;
ll l = 1, r = 1e9;
while (l < r) {
ll mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
cout << r << '
';
}
return 0;
}
D
看成差分, 就完事
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n >> a[1];
ll cur = 0;
rep (i, 2, n) if (a[i] < a[i - 1]) cur += a[i - 1] - a[i];
if (a[1] >= cur) cout << "YES
";
else cout << "NO
";
}
return 0;
}
F
咱们首先把 0 的情况找出来
无非是 两边都不能删除呗
但是你要注意道, 你左右两边是 bj (j < i), 其实是可以删除的
那不就很简单了, 当你两边都能删那就 * 2, 那为啥删除数没影响呢?
你删的 是 ai, 得到了 bk, 且 bk 对于 以后的 bj 是可以删除的, 没变化
int main() {
IOS;
for (cin >> _; _; --_) {
cin >> n >> m;
unordered_map<int, int> st;
rep(i, 1, n) cin >> a[i], w[a[i]] = i, v[i] = 0;
ll ans = 1;
rep(i, 1, m) cin >> b[i], v[b[i]] = 1;
bool f = 0;
rep(i, 1, m) {
int cur = w[b[i]];
if ((cur == n || v[a[cur + 1]]) && (v[a[cur - 1]] || cur == 1)) f = 1;
if (cur == n || cur == 1 || v[a[cur + 1]] || v[a[cur - 1]]) v[b[i]] = 0;
else ans = ans * 2 % mod;
}
if (f) cout << 0 << '
';
else cout << ans << '
';
}
return 0;
}