注:试题D 通过75% 试题H 通过 56%
其他通过率100%
3
75 3
53 2
59 2
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
cin >> n;
int a, b;
int mx = 1 << 30, mn = 0;
for (int i = 1; i <= n; i++) {
scanf("%d%d", &a, &b);
mx = min(mx, a / b);
int t = a / (b + 1);
++t;
mn = max(mn, t);
}
printf("%d %d\n", mn, mx);
return 0;
}
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
#include <bits/stdc++.h>
using namespace std;
struct node {
int t, d, l;
bool operator < (const node &A) const {
if (t + d == A.t + A.d)
return l < A.l;
return t + d < A.t + A.d;
}
} a[100001];
int k, n;
inline void solve() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d%d", &a[i].t, &a[i].d, &a[i].l);
sort(a + 1, a + n + 1);
int last = a[1].t + a[1].l;
int ok = 1;
for (int i = 2; i <= n && ok; i++) {
if (last > a[i].t + a[i].d)
ok = 0;
else
last += a[i].l;
}
if (ok)
printf("YES\n");
else
printf("NO\n");
}
int main() {
cin >> k;
while (k--)
solve();
return 0;
}
5
11 121 22 12 2023
#include <bits/stdc++.h>
using namespace std;
struct node {
int x, y;
} a[100001];
int n, f[100001][10];
char s[12];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%s", s + 1);
int x = s[1] - '0';
int y = s[strlen(s + 1)] - '0';
a[i].x = x, a[i].y = y;
}
f[1][a[1].y] = 1;
for (int i = 2; i <= n; i++)
for (int j = 0; j <= 9; j++) {
f[i][j] = max(f[i][j], f[i - 1][j]);
if (j == a[i].x)
f[i][a[i].y] = max(f[i][a[i].y], f[i - 1][j] + 1);
}
int mx = 0;
for (int i = 0; i <= 9; i++)
mx = max(mx, f[n][i]);
printf("%d\n", n - mx);
return 0;
}
4
abababdb a b
#include <bits/stdc++.h>
using namespace std;
long long ans = 0;
int n, pre[500001];
char s[500002], a, b;
int main() {
scanf("%d", &n);
scanf("%s", s + 1);
cin >> a >> b;
int len = strlen(s + 1);
for (int i = 1; i <= len; i++) {
pre[i] = pre[i - 1];
if (s[i] == a)
++pre[i];
}
for (int i = n; i <= len; i++)
if (s[i] == b)
ans += pre[i - n + 1];
printf("%lld\n", ans);
return 0;
}
5 3
1 4 2 8 7
#include <bits/stdc++.h>
using namespace std;
struct node {
long long data;
int left, right, f;
} a[500001];
int n, k;
set<pair<long long, int> > q;
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i].data);
a[i].left = i - 1;
a[i].right = i + 1;
a[i].f = 1;
}
for (int i = 1; i <= n; i++)
q.insert({a[i].data, i});
while (k-- && q.size()) {
long long num = q.begin()->first;
int idx = q.begin()->second;
a[idx].f = 0;
q.erase(q.begin());
int l = a[idx].left;
int r = a[idx].right;
if (l > 0) {
q.erase({a[l].data, l});
a[l].data += num;
a[l].right = a[idx].right;
q.insert({a[l].data, l});
}
if (r <= n) {
q.erase({a[r].data, r});
a[r].data += num;
a[r].left = a[idx].left;
q.insert({a[r].data, r});
}
}
for (int i = 1; i<= n; i++)
if (a[i].f)
printf("%lld ", a[i].data);
printf("\n");
return 0;
}
思路:预处理要访问相邻景点之间花费时间,以及访问所有景点所花费时间
在跳过第i个景区时,要求与第i个景点相邻的两个景点之间的花费时间,倍增每次查询log(n),(边缘情况领讨论),总时间复杂度n lng(n)
6 4
1 2 1
1 3 1
3 4 2
3 5 2
4 6 3
2 6 5 1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node {
int y, z;
};
int n, k, a[100001], dep[100001], pre[100001], f[100001][21];
ll dis[100001][21], temp, sum = 0;
vector<node> v[100001];
map<int, map<int, ll> > mp;
inline void dfs(int x) {
for (auto i : v[x])
if (i.y != pre[x]) {
pre[i.y] = x;
dep[i.y] = dep[x] + 1;
f[i.y][0] = x;
dis[i.y][0] = i.z;
dfs(i.y);
}
}
inline void init() {
for (int i = 1; i <= 20; i++)
for (int j = 1; j <= n; j++) {
f[j][i] = f[f[j][i - 1]][i - 1];
dis[j][i] = dis[j][i - 1] + dis[f[j][i - 1]][i - 1];
}
}
int UP(int x, int k) {
int res = x;
for (int i = 0; (1 << i) <= k; i++)
if ((1 << i) & k) {
temp += dis[res][i];
res = f[res][i];
}
return res;
}
int LCA(int x, int y) {
if (dep[x] < dep[y])
swap(x, y);
int rot = UP(x, dep[x] - dep[y]);
if (rot == y)
return rot;
for (int i = 20; i >= 0; i--)
if (f[rot][i] != f[y][i]) {
temp += dis[rot][i];
temp += dis[y][i];
rot = f[rot][i];
y = f[y][i];
}
temp += dis[rot][0] + dis[y][0];
return f[rot][0];
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i < n; i++) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
v[x].push_back({y, z});
v[y].push_back({x, z});
}
for (int i = 1; i<= k; i++)
scanf("%d", &a[i]);
dfs(1);
init();
for (int i = 1; i < k; i++) {
temp = 0;
int d = LCA(a[i], a[i + 1]);
mp[a[i]][a[i + 1]] = mp[a[i + 1]][a[i]] = temp;
sum += temp;
}
// printf("%lld\n", sum);
for (int i = 1; i <= k; i++) {
if (i == 1)
printf("%lld ", sum - mp[a[i]][a[i + 1]]);
else if (i == k)
printf("%lld ", sum - mp[a[i - 1]][a[i]]);
else {
temp = 0;
int d = LCA(a[i - 1], a[i + 1]);
printf("%lld ", sum + temp - mp[a[i]][a[i - 1]] - mp[a[i]][a[i + 1]]);
}
}
return 0;
}
/*
6 4
1 2 1
1 3 1
3 4 2
3 5 2
4 6 3
2 6 5 1
*/
6 2
1 2
2 3
4 3
2 5
6 5
3 6
4 5
4
#include <bits/stdc++.h>
using namespace std;
struct edge {
int x, y;
} a[50001];
int n, m, ans = -1, pre[100001], dep[100001], c[100001], f[100001][21];
map<pair<int, int>, int> mp;
vector<int> v[100001];
inline void dfs(int x) {
for (auto y : v[x])
if (y != pre[x]) {
pre[y] = x;
dep[y] = dep[x] + 1;
f[y][0] = x;
dfs(y);
}
}
int UP(int x, int k) {
int res = x;
for (int i = 0; (1 << i) <= k; i++)
if ((1 << i) & k)
res = f[res][i];
return res;
}
int LCA(int x, int y) {
if (dep[x] < dep[y])
swap(x, y);
int rot = UP(x, dep[x] - dep[y]);\
if (rot == y)
return rot;
for (int i = 20; i >= 0; i--)
if (f[rot][i] != f[y][i]) {
rot = f[rot][i];
y = f[y][i];
}
return f[rot][0];
}
inline void pushdown(int x) {
for (auto y : v[x])
if (y != pre[x]) {
pushdown(y);
c[x] += c[y];
if (c[y] == m)
ans = max(ans, mp[{x, y}]);
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i < n; i++) {
int x, y;
scanf("%d%d", &x ,&y);
v[x].push_back(y);
v[y].push_back(x);
mp[{x, y}] = mp[{y, x}] = i;
}
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d%d", &x ,&y);
a[i].x = x, a[i].y = y;
}
dfs(1);
for (int i = 1; i <= 20; i++)
for (int j = 1; j <= n; j++)
f[j][i] = f[f[j][i - 1]][i - 1];
for (int i = 1; i <= m; i++) {
int x = a[i].x, y = a[i].y;
int d = LCA(x, y);
++c[x], ++c[y];
c[d] -= 2;
}
pushdown(1);
printf("%d\n", ans);
return 0;
}