从 \(2024.11.05\) 之前的比赛排着刷。

CF2028 E

这道题主要考察的是手玩能力和转移技巧。

给定一棵树,根为 \(1\)。爱丽丝的起点位于某个顶点 \(v\) 。她想走出洞口,但不幸的是,红心皇后已经下令处死她。

每分钟都会掷一枚公平的硬币。如果硬币是正面,爱丽丝就可以移动到她当前位置的相邻顶点,反之,红心皇后就可以把爱丽丝拉到皇后选择的相邻顶点。如果爱丽丝最终出现在树的非根叶子上,那么爱丽丝就输了。

假设两人都以最佳方式移动,计算爱丽丝成功逃离每个起始顶点 \(1\le v\le n\) 的概率。对 \(998\,244\,353\) 取模的值。\(n \le 10 ^ 5\)。


首先需要一个 key observation,就是 Alice 的最优策略一定是向父亲走,红心皇后的最优策略一定是向深度最小的叶子走。设每个点深度最小的儿子是 \(s_u\),Alice 从这个点出发逃离概率是 \(f_u\)。那么有转移:

\[f(u) = \dfrac{1}{2}(f(s_u) +f(fa_u))
\]

其中 \(f(1) = 1, f(u \mid u \in \text{leaf}) = 0\)。

这个转移方式有点技巧。假设有链 \(1 \rightarrow 2 \rightarrow 3 \rightarrow 4 \cdots\)。那么 \(f(2) = \dfrac{1}{2} f(1) + \dfrac{1}{2} f(3)\)。

接下来有 \(f(3) = \dfrac{1}{2} f(2) + \dfrac{1}{2} f(4) = \dfrac{1}{4} f(1) + \dfrac{1}{4} f(3) + \dfrac{1}{2} f(4)\)。移项整理得到 \(f(3) = \dfrac{1}{3} f(1) +\dfrac{2}{3} f(4)\)。

同样操作可以发现规律 \(f(i) = \dfrac{i}{1} f(1) + \dfrac{i - 1}{i} f(i + 1)\)。

首先将树按照浅儿子剖成若干链,对链单独转移,然后再对链顶单独转移即可。预处理逆元可以做到线性。

int f[N], n, m, fa[N], dep[N], s[N];
vector<int> E[N];
void dfs(int u, int F) {
fa[u] = F; for (auto v : E[u]) if (v ^ F) {
dfs(v, u); if (!dep[u]) dep[u] = dep[v] + 1, s[u] = v;
else if (dep[v] + 1 < dep[u]) s[u] = v, dep[u] = dep[v] + 1;
}
}
void dp(int u, int t, int d) {
if (!s[u]) return; dp(s[u], t, d + 1);
f[u] = (d * qpow(d + 1) % mod * f[s[u]] % mod + qpow(d + 1) * t % mod) % mod;
for (auto v : E[u]) if ((v ^ fa[u]) and (v ^ s[u])) dp(v, f[u] % mod, 1);
}
void sub() {
read(n);
rep(i, 1, n) E[i].clear(), dep[i] = 0, s[i] = 0, f[i] = 0;
rop(i, 1, n) {
int a, b; read(a, b);
E[a].push_back(b);
E[b].push_back(a);
} dfs(1, 0); f[1] = 1; dp(1, 1, 0);
rep(i, 1, n) printf("%lld ", f[i]);
return;
}

CF2032 E

这道题考察的主要是观察力和构造水平。

给你一个数组 \(a\),可以进行若干次操作,可以进行任意次操作。

每次操作选择一个位置 \(i(1 \le i \le n)\),并且使 \(a_i \leftarrow a_i + 2\),\(a_{i - 1} \leftarrow a_{i - 1} + 1\),\(a_{i + 1} \leftarrow a_{i + 1} + 1\)。特别地,\(1\) 的上一个位置是 \(n\),\(n\) 的下一个位置是 \(1\),也就是说,这是一个循环数组。你需要构造一组方案。


首先我们发现这个答案有一定的单调性。即如果能使他们都变成 \(x\),那么也可以通过把他们全操作一遍使他们变成 \(x + 4\)。因此先设他们能变成一个大数 \(I\),将问题转化为判定性问题。

不妨设 \(b_i = I - a_i\),则条件充要转化为:\(\forall i \le n\),\(p_{i - 1} + 2 p_i + p_{i + 1} = b_i\)。

发现将每个位置作为开头,剩下的往后顺延,将奇数位置的 \(b\) 的和,减去偶数位置的 \(b\) 的和,得到的就是 \((p_i + p_{i - 1}) \times 2\)。有了这个之后,剩下的就好求了。复杂度是线性的。

void sub() {
read(n);
rep(i, 1, n) read(a[i]);
auto solve = [&](int q) -> bool {
rep(i, 1, n) b[i] = q - a[i];
s[1] = b[1], s[2] = b[2];
rep(i, 3, n) s[i] = s[i - 2] + b[i];
rep(i, 1, n) {
t[i] = s[(i & 1) ? n : n - 1] - s[max(i - 2, 0)];
t[i] += s[i - 1];
t[i] -= s[(i & 1) ? n - 1 : n] - s[max(i - 1, 0)];
t[i] -= s[max(i - 2, 0)];
}
rep(i, 1, n) if (t[i] & 1) return 0; rep(i, 1, n) t[i] >>= 1;
int o = 0; rep(i, 2, n) o += ((i & 1) ? -1 : 1) * t[i]; // p[1] - p[n]
if ((o + t[1]) & 1) return 0;
p[1] = (o + t[1]) >> 1;
rep(i, 2, n) p[i] = t[i] - p[i - 1];
rep(i, 1, n) if (p[i] < 0) return 0;
rep(i, 1, n) printf("%lld ", p[i]); puts("");
return 1;
};
if (solve(I)) return;
if (solve(I + 1)) return;
if (solve(I + 2)) return;
if (solve(I + 3)) return;
}

NOIP 备赛:CF 2E 板刷的更多相关文章

  1. 【Diary】CSP-S2 2021 游记 & NOIP 备赛发疯日记

    Day 0 两个极端的回跳. .....不行啊. 我快输不起了........... ------------------------------- 早上被生物钟强行唤醒,逼自己懒床到6:40. 弹琴 ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  10. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. JavaScript中class的静态属性和静态方法

    我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "prototype" .这样的方法被称为 静态的(static). 例如这样: class Animal { static ...

  2. Angular 17+ 高级教程 – Routing 路由 (功能篇)

    前言 这篇只讲功能不讲原理.没有循序渐进,没有由浅入深,一个主题讲到底. Route 目录 上一篇 Angular 17+ 高级教程 – Routing 路由 (原理篇) 下一篇 Angular 17 ...

  3. JavaScript – Temporal API & Date

    前言 Temporal API 是 JS 的新东西,用来取代 Date.虽然现在 (12-09-2024) 依然没有任何游览器支持 Temporal API,但它已经是 stage 3 了,而且有完整 ...

  4. Asp.net core 学习笔记之 Tag Helper

    refer : https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/authoring?view=aspnetcore ...

  5. 暑假集训SCP提高模拟10

    我(看着百度百科):我已经知道这场谁组的题了 CTH: 谁 我:你想想,能在模拟赛里塞四道数学题还玩邦的,还能有谁 CTH: 我不知道 我:我不知道 CTH: 我知道了 我:我知道了 我:我是 Bob ...

  6. [namespace hdk] 向量 direct_vector

    我忏悔我有罪我心情又不好了不知道干什么所以又不小心封了个东西啊啊啊啊啊啊啊啊 功能 已重载 [] 运算符(左值) 已重载 = 运算符(可使用向量或 std:::vector) 已重载 + += - - ...

  7. Kubernetes Pod生命周期(十七)

    前面我们已经了解了 Pod 的设计原理,接下来我们来了解下 Pod 的生命周期.下图展示了一个 Pod 的完整生命周期过程,其中包含 Init Container.Pod Hook.健康检查 三个主要 ...

  8. 《Vue.js 设计与实现》读书笔记 - 第11章、快速 Diff 算法

    第11章.快速 Diff 算法 11.1 相同的前置元素和后置元素 快速 Diff 算法包含预处理步骤,这借鉴了纯文本 Diff 算法的思路. 先把相同的前缀后缀进行处理,然后再比较中间部分. fun ...

  9. [rCore学习笔记 029] 动态内存分配器实现-以buddy_system_allocator源码为例

    在上一部分,我们讲了动态内存分配器的原理是维护一个堆,而且是实现各种连续内存分配方法. 但是上一部分是直接通过引用了buddy_system_allocator来解决的问题. 那么对于内存分配算法有兴 ...

  10. union联合体的缺陷

    传统的 union 联合体在 C++ 中虽然提供了一种能够在相同的内存空间内存储多种不同类型的方式,但它也有一些显著的缺陷和限制.这些缺陷让 union 的使用不太安全,尤其是在复杂的程序中.以下是传 ...