VP Educational Codeforces Round 22
A. The Contest
题意:有
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
int m;
std::cin >> m;
std::vector<int> l(m), r(m);
for (int i = 0; i < m; ++ i) {
std::cin >> l[i] >> r[i];
}
i64 sum = std::accumulate(a.begin(), a.end(), 0ll);
for (int i = 0; i < m; ++ i) {
if (l[i] >= sum) {
std::cout << l[i] << "\n";
return;
} else if (l[i] <= sum && r[i] >= sum) {
std::cout << sum << "\n";
return;
}
}
std::cout << -1 << "\n";
}
B. The Golden Age
题意:给你一个
因为是幂,则数量很少,可以直接求出所有在
点击查看代码
void solve() {
i64 x, y, l, r;
std::cin >> x >> y >> l >> r;
std::vector<i64> a, b;
for (i128 i = 1; i <= r; i *= x) {
a.push_back(i);
}
for (i128 i = 1; i <= r; i *= y) {
b.push_back(i);
}
std::vector<i64> c;
for (auto & i : a) {
for (auto & j : b) {
if (i + j >= l && i + j <= r) {
c.push_back(i + j);
}
}
}
c.push_back(l - 1);
c.push_back(r + 1);
std::sort(c.begin(), c.end());
int n = c.size();
i64 ans = 0;
for (int i = 1; i < n; ++ i) {
// std::cout << c[i] << " \n"[i == n - 1];
ans = std::max(ans, c[i] - c[i - 1] - 1);
}
std::cout << ans << "\n";
}
C. The Tag Game
题意:在一棵树上,
以这两个点为根做两次
点击查看代码
void solve() {
int n, x;
std::cin >> n >> x;
-- x;
std::vector<std::vector<int>> adj(n);
for (int i = 1; i < n; ++ i) {
int u, v;
std::cin >> u >> v;
-- u, -- v;
adj[u].push_back(v);
adj[v].push_back(u);
}
std::vector d(2, std::vector<int>(n, -1));
auto work = [&](int s, int i) -> void {
std::queue<int> q;
q.push(s);
d[i][s] = 0;
while (q.size()) {
int u = q.front(); q.pop();
for (auto & v : adj[u]) {
if (d[i][v] == -1) {
d[i][v] = d[i][u] + 1;
q.push(v);
}
}
}
};
work(0, 0); work(x, 1);
int ans = 0;
for (int i = 0; i < n; ++ i) {
if (d[1][i] < d[0][i]) {
ans = std::max(ans, d[0][i]);
}
}
std::cout << ans * 2 << "\n";
}
D. Two Melodies
题意:在一个数组种选两个不相交的子序列,每个子序列相邻的两个数要么相差1,要么余7相同。使得两个子序列长度加起来最大。
如果我们向每个
我们可以对于每个
这个问题可以由
点击查看代码
template<class T>
struct MinCostFlow {
struct _Edge {
int to;
T cap;
T cost;
_Edge(int to_, T cap_, T cost_) : to(to_), cap(cap_), cost(cost_) {}
};
int n;
std::vector<_Edge> e;
std::vector<std::vector<int>> g;
std::vector<T> h, dis;
std::vector<int> pre;
bool dijkstra(int s, int t) {
dis.assign(n, std::numeric_limits<T>::max());
pre.assign(n, -1);
std::priority_queue<std::pair<T, int>, std::vector<std::pair<T, int>>, std::greater<std::pair<T, int>>> que;
dis[s] = 0;
que.emplace(0, s);
while (!que.empty()) {
T d = que.top().first;
int u = que.top().second;
que.pop();
if (dis[u] != d) {
continue;
}
for (int i : g[u]) {
int v = e[i].to;
T cap = e[i].cap;
T cost = e[i].cost;
if (cap > 0 && dis[v] > d + h[u] - h[v] + cost) {
dis[v] = d + h[u] - h[v] + cost;
pre[v] = i;
que.emplace(dis[v], v);
}
}
}
return dis[t] != std::numeric_limits<T>::max();
}
MinCostFlow() {}
MinCostFlow(int n_) {
init(n_);
}
void init(int n_) {
n = n_;
e.clear();
g.assign(n, {});
}
void addEdge(int u, int v, T cap, T cost) {
g[u].push_back(e.size());
e.emplace_back(v, cap, cost);
g[v].push_back(e.size());
e.emplace_back(u, 0, -cost);
}
std::pair<T, T> flow(int s, int t) {
T flow = 0;
T cost = 0;
h.assign(n, 0);
while (dijkstra(s, t)) {
for (int i = 0; i < n; ++i) {
h[i] += dis[i];
}
T aug = std::numeric_limits<int>::max();
for (int i = t; i != s; i = e[pre[i] ^ 1].to) {
aug = std::min(aug, e[pre[i]].cap);
}
for (int i = t; i != s; i = e[pre[i] ^ 1].to) {
e[pre[i]].cap -= aug;
e[pre[i] ^ 1].cap += aug;
}
flow += aug;
cost += aug * h[t];
}
return std::make_pair(flow, cost);
}
struct Edge {
int from;
int to;
T cap;
T cost;
T flow;
};
std::vector<Edge> edges() {
std::vector<Edge> a;
for (int i = 0; i < e.size(); i += 2) {
Edge x;
x.from = e[i + 1].to;
x.to = e[i].to;
x.cap = e[i].cap + e[i + 1].cap;
x.cost = e[i].cost;
x.flow = e[i + 1].cap;
a.push_back(x);
}
return a;
}
};
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
MinCostFlow<int> mf(2 * n + 4);
int s = 2 * n, t = 2 * n + 1, S = 2 * n + 2, T = 2 * n + 3;
mf.addEdge(S, s, 2, 0);
mf.addEdge(t, T, 2, 0);
for (int i = 0; i < n; ++ i) {
mf.addEdge(s, i, 1, 0);
mf.addEdge(i + n, t, 1, 0);
mf.addEdge(i, i + n, 1, -1);
for (int j = i + 1; j < n; ++ j) {
if (a[i] == a[j] + 1) {
mf.addEdge(i + n, j, 1, 0);
break;
}
}
for (int j = i + 1; j < n; ++ j) {
if (a[i] == a[j] - 1) {
mf.addEdge(i + n, j, 1, 0);
break;
}
}
for (int j = i + 1; j < n; ++ j) {
if (a[i] % 7 == a[j] % 7) {
mf.addEdge(i + n, j, 1, 0);
mf.addEdge(i, j, 1, 0);
break;
}
}
}
std::cout << -mf.flow(S, T).second << "\n";
}
E. Army Creation
题意:有
记
点击查看代码
#define ls(u) tr[u].lson
#define rs(u) tr[u].rson
const int N = 1e5 + 5;
struct Node {
int lson, rson;
int sum;
}tr[N << 5];
int tot = 0;
int root[N];
void insert(int & u, int v, int l, int r, int p) {
u = ++ tot;
tr[u] = tr[v];
tr[u].sum += 1;
if (l == r) {
return;
}
int mid = l + r >> 1;
if (p <= mid) {
insert(ls(u), ls(v), l, mid, p);
} else {
insert(rs(u), rs(v), mid + 1, r, p);
}
}
int query(int u, int v, int l, int r, int L, int R) {
if (!u) {
return 0;
}
if (L <= l && r <= R) {
return tr[u].sum - tr[v].sum;
}
int mid = l + r >> 1;
if (R <= mid) {
return query(ls(u), ls(v), l, mid, L, R);
} else if (L > mid) {
return query(rs(u), rs(v), mid + 1, r, L, R);
}
return query(ls(u), ls(v), l, mid, L, mid) + query(rs(u), rs(v), mid + 1, r, mid + 1, R);
}
void solve() {
int n, k;
std::cin >> n >> k;
std::vector<std::vector<int>> pos(N);
std::vector<int> a(n + 1);
for (int i = 1; i <= n; ++ i) {
std::cin >> a[i];
pos[a[i]].push_back(i);
int p = 0;
if (pos[a[i]].size() > k) {
p = pos[a[i]][(int)pos[a[i]].size() - 1 - k];
}
insert(root[i], root[i - 1], 0, n, p);
}
int q;
std::cin >> q;
int last = 0;
while (q -- ) {
int l, r;
std::cin >> l >> r;
l = (l + last) % n + 1;
r = (r + last) % n + 1;
if (l > r) {
std::swap(l, r);
}
last = r - l + 1 - query(root[r], root[l - 1], 0, n, l, r);
std::cout << last << "\n";
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】