A
可以用线段树的样子。
B
。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<int> a(n);
unordered_set<int> s;
for (int i = 0; i < n; i++) {
cin >> a[i];
s.insert(a[i]);
}
int ans = 1;
while (s.count(ans)) {
ans++;
}
cout << min(k, ans) << '\n';
return 0;
}
C
答案为 。
表示 的因子数量,。
。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> d(n + 1);
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j += i) {
d[j]++;
}
}
i64 ans = 0;
for (int i = 1; i <= n; i++) {
ans += 1LL * d[i] * d[n - i];
}
cout << ans << '\n';
return 0;
}
D
记 ,首先 是非负整数,则 一定 No。
再按位考虑,若 和 二进制有相同位为 则 No。
。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
void solve() {
i64 a, s;
cin >> a >> s;
i64 d = s - 2 * a;
if (d < 0 || (d & a)) {
cout << "No\n";
return;
}
cout << "Yes\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
E
。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
int ans = 0;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
int y = sqrt(x);
if (y * y == x) {
ans++;
}
}
cout << ans << '\n';
return 0;
}
F
记 ,答案为 。
等比数列求和。
,为 。
,为 。
考虑降幂。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
constexpr int P = 998244353;
i64 power(i64 a, i64 b, int p = P) {
i64 res = 1;
for (; b; b >>= 1, a = a * a % p) {
if (b & 1) {
res = res * a % p;
}
}
return res;
}
i64 inv(i64 x) {
return power(x, P - 2);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
i64 n, x;
cin >> n >> x;
x %= P;
if (x == 1) {
cout << power(2, n + 1) << '\n';
} else {
i64 k = power(2, n + 1, P - 1);
cout << (power(x, k) - 1 + P) % P * inv(x - 1) % P << '\n';
}
return 0;
}
G
弱化版本:https://vjudge.csgrandeur.cn/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-42547
有一种做法是树状数组套主席树。
复杂度不会算。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
constexpr int inf = 1E9;
constexpr int N = 4E4;
struct node {
int l, r;
i64 sum;
} seg[N * 300];
int tot;
void add(int &t, int l, int r, int p, int v) {
if (!t) {
t = ++tot;
}
seg[t].sum += v;
if (l == r) {
return;
}
int m = (l + r) >> 1;
if (p <= m) {
add(seg[t].l, l, m, p, v);
} else {
add(seg[t].r, m + 1, r, p, v);
}
}
i64 query(int &t, int l, int r, int p) {
if (!t) {
return 0;
}
if (l == r) {
return seg[t].sum;
}
int m = (l + r) >> 1;
if (p <= m) {
return query(seg[t].l, l, m, p);
} else {
return seg[seg[t].l].sum + query(seg[t].r, m + 1, r, p);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<int> a(n);
vector<int> tree(n);
auto modify = [&](int i, int v) {
for (i++; i <= n; i += i & -i) {
add(tree[i - 1], 1, inf, abs(v), v);
}
};
auto get = [&](int i, i64 v) {
i64 res = 0;
for (; i; i -= i & -i) {
res += query(tree[i - 1], 1, inf, v);
}
return res;
};
for (int i = 0; i < n; i++) {
cin >> a[i];
modify(i, a[i]);
}
for (int i = 0; i < q; i++) {
int o;
cin >> o;
if (o == 1) {
int x, y;
cin >> x >> y;
x--;
modify(x, -a[x]);
modify(x, y);
a[x] = y;
} else {
int l, r;
cin >> l >> r;
l--;
i64 ans = 0;
while (1) {
i64 p = min<i64>(inf, ans);
i64 res = get(r, p) - get(l, p) + 1;
if (res == ans) {
break;
}
ans = res;
}
cout << ans << '\n';
}
}
return 0;
}
H
排个序,然后前缀和,要是 那说明 没有出现过。
。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.begin(), a.end());
vector<i64> sum(n + 1);
for (int i = 0; i < n; i++) {
sum[i + 1] = sum[i] + a[i];
}
for (int i = 0; i < n; i++) {
if (sum[i] + 1 < a[i]) {
cout << sum[i] + 1 << '\n';
return 0;
}
}
cout << sum[n] + 1 << '\n';
return 0;
}
J
。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
template <class T>
T max(const vector<T> &a) {
return *max_element(a.begin(), a.end());
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> a;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
if (x % 2) {
a.push_back(x);
}
}
cout << max(a) << '\n';
return 0;
}
K
。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
string s;
cin >> n >> s;
bool ok = 0;
for (auto &si : s) {
if (si == '(') {
ok = 1;
} else if (si == ',') {
if (ok) {
si = '.';
}
} else if (si == ')') {
ok = 0;
}
}
cout << s << '\n';
return 0;
}
L
贪心。
。
C++ Code
#include "bits/stdc++.h"
using namespace std;
using i64 = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, h;
cin >> n >> h;
vector<int> a(n), b(n);
vector<pair<int, int>> v;
for (int i = 0; i < n; i++) {
cin >> a[i] >> b[i];
v.push_back({a[i], 0});
v.push_back({b[i], 1});
}
sort(v.begin(), v.end(), greater());
int ans = 0;
for (int i = 0; i < 2 * n; i++) {
if (v[i].second == 1) {
h -= v[i].first;
ans++;
} else {
ans += (h + v[i].first - 1) / v[i].first;
break;
}
}
cout << ans << '\n';
return 0;
}