VP Codeforces Round 907 (Div. 2)
A. Sorting with Twos
题意:给你一个数组,你每次可以给前
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
for (int i = 1, j = 2; i < n; j *= 2) {
for (int k = i; k + 1 < j && k + 1 < n; ++ k) {
if (a[k] > a[k + 1]) {
std::cout << "NO\n";
return;
}
}
i = j;
}
std::cout << "YES\n";
}
B. Deja Vu
题意:
如果一个数是
点击查看代码
void solve() {
int n, q;
std::cin >> n >> q;
std::vector<i64> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::vector<std::vector<int> > b(31);
for (int i = 0; i < n; ++ i) {
for (int j = 30; j >= 0; -- j) {
if (a[i] % (1ll << j) == 0) {
b[j].push_back(i);
break;
}
}
}
while (q -- ) {
int x;
std::cin >> x;
for (int i = x; i <= 30; ++ i) {
for (auto & j : b[i]) {
a[j] += 1 << (x - 1);
b[x - 1].push_back(j);
}
b[i].clear();
}
}
for (int i = 0; i < n; ++ i) {
std::cout << a[i] << " \n"[i == n - 1];
}
}
C. Smilo and Monsters
题意:
考虑模拟,从小到大一个一个减一,
假设剩下
点击查看代码
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (int i = 0; i < n; ++ i) {
std::cin >> a[i];
}
std::sort(a.begin(), a.end());
int l = 0, r = n - 1;
i64 ans = 0, x = 0;
while (l < r) {
// std::cout << l << " " << r << "\n";
if (x + a[l] >= a[r]) {
ans += a[r] - x;
ans += 1;
a[l] = x + a[l] - a[r];
a[r] = 0;
x = 0;
-- r;
if (a[l] == 0) {
++ l;
}
} else {
x += a[l];
ans += a[l];
++ l;
}
}
if (l == r) {
// std::cout << ans << " " << a[r] << " " << x << "\n";
//x + y <= a[r] - y
//2y <= a[r] - x
if (a[r] == 1) {
ans += 1;
} else {
a[r] -= x;
ans += (a[r] + 1) / 2 + 1;
}
}
std::cout << ans << "\n";
}
D. Suspicious logarithms
题意:
点击查看代码
void solve() {
i64 l, r;
std::cin >> l >> r;
Z ans = 0;
while (l <= r) {
i64 f = std::__lg(l);
i64 x = (1ll << (f + 1)) - 1;
// std::cerr << l << " " << x << "\n";
i128 now = 1;
for (i64 i = 0, last = 0; last <= std::min(x, r); now *= f, ++ i) {
if (now <= l) {
continue;
}
i64 L = std::max(l, last), R = std::min<i128>({x, r, now - 1});
// std::cout << L << " " << R << " " << i << "\n";
ans += (Z)(R - L + 1) * (i - 1);
last = R + 1;
}
l = x + 1;
}
std::cout << ans << "\n";
}
F. A Growing Tree
题意:开始有一个节点,每次新增一个节点到节点
用树状数组维护每个操作时间总共加的值,那么可以离线后跑
点击查看代码
template <class T>
struct Fenwick {
int n;
std::vector<T> tr;
Fenwick(int _n) {
init(_n);
}
void init(int _n) {
n = _n;
tr.assign(_n + 1, {});
}
void add(int x, T v) {
for (int i = x; i <= n; i += i & -i) {
tr[i] += v;
}
}
T query(int x) {
T res = 0;
for (int i = x; i; i -= i & -i) {
res += tr[i];
}
return res;
}
T sum(int l, int r) {
return query(r) - query(l - 1);
}
};
void solve() {
int q;
std::cin >> q;
std::vector<std::vector<int>> adj(q + 1);
std::vector<std::vector<std::pair<int, int>>> g(q + 1);
std::vector<int> id(q + 1);
int n = 1;
for (int i = 1; i <= q; ++ i) {
int op, x, y;
std::cin >> op >> x;
if (op == 1) {
-- x;
id[n] = i;
adj[x].push_back(n ++ );
} else {
-- x;
std::cin >> y;
g[x].push_back({i, y});
}
}
Fenwick<i64> tr(q + 1);
std::vector<i64> ans(n);
auto dfs = [&](auto self, int u) -> void {
for (auto & [t, v] : g[u]) {
tr.add(t, v);
}
ans[u] = tr.sum(id[u] + 1, q);
for (auto & v : adj[u]) {
self(self, v);
}
for (auto & [t, v] : g[u]) {
tr.add(t, -v);
}
};
dfs(dfs, 0);
for (int i = 0; i < n; ++ i) {
std::cout << ans[i] << " \n"[i == n - 1];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!