HD 2025 春季联赛 3

news/2025/3/22 21:20:07/文章来源:https://www.cnblogs.com/Young-Cloud/p/18787145

1001

数学 Lucas定理

解题思路

一看题就知道我们要求当 \(b_i \in [1, L_i]\) 内,有多少 \(b_i\) 使得 \((^{a_i}_{b_i})\) 是奇数。

于是我们看 \(Lucas\) 定理:

对于素数 \(p\),有:

\[(^n_k) \equiv (^{\lfloor{n \over p}\rfloor}_{\lfloor{k \over p}\rfloor})(^{n \% p}_{k \% p}) (mod\ p) \]

其中当 \(n < k\) 时, \((^n_k) = 0\)

当我们将 2 代入 \(p\),我们还可以这样看 \(lucas\) 定理:

\[(^n_k) \equiv (^{n >> 1}_{k >> 1})(^{n \% 2}_{k \% 2}) (mod\ 2) \]

其中 \(x >> 1\) 就是 \(\lfloor {x \over 2} \rfloor\)

\(p\) 等于 2 时,我们可以发现 \((^0_1) = 0\)。这就意味着若想 \((^n_k)\) 是奇数,则不能出现 \(n\) 是偶数时且 \(k\) 是奇数这种情况。推广到每一位,就是当 \(n\) 的某一位是 0 时, \(k\) 中对应的那一位不能是 1。

于是符合条件的 \(b_i\) 就显然了:既要满足在给定的范围之内,又要满足由 \(Lucas\) 定理推导出来的限制。

CODE
int a[N + 5];int cnt(int L, int x) {// 不大于 L 的最大的满足 x 的数int cur = 0, res = 0;for (int i = 30; i >= 0; i--) {if (x >> i & 1) {res <<= 1;if ((cur | (1 << i)) <= L){cur |= (1 << i);res |= 1;}}}return res + 1;
}void solve()
{int n = 0;std::cin >> n;for (int i = 0; i < n; i++) {std::cin >> a[i];}i64 ans = 1ll;for (int i = 0, L = 0; i < n; i++) {std::cin >> L;(ans *= cnt(L, a[i])) %= Mod;}std::cout << ans << '\n';
}

1003

思维 数据结构

解题思路

先将靠初始值就满足条件的公司都放在一个队列里,对于初始值不满足条件的公司,我们记录下有多少项不满足条件,并且对于每一项不满足条件的能力,我们用一个小根堆维护(后面能力提升后就可以快速找到满足了那些条件)

CODE
i64 a[M], cnt[N]; // cnt[i] 有多少能力不满组第 i 各公司的要求bool solve()
{int n = 0, m = 0;std::cin >> n >> m;for (int i = 0; i < m; i++) {std::cin >> a[i];}std::vector w(n, std::vector(m, 0));std::vector pq(m, std::priority_queue<std::pair<int, int>>{});std::queue<int> q;for (int i = 0; i < n; i++) {cnt[i] = 0;for (int j = 0; j < m; j++) {int c = 0;std::cin >> c;if (a[j] < c) {cnt[i]++;pq[j].push({ -c, i });}}if (cnt[i] == 0) {// 初始时就满足的直接入队q.push(i);}for (int j = 0; j < m; j++) {std::cin >> w[i][j];}}while (not q.empty()) {int cur = q.front();q.pop();for (int i = 0; i < m; i++) {a[i] += w[cur][i];while (not pq[i].empty() && -(pq[i].top().first) <= a[i]) {auto [val, idx] = pq[i].top();pq[i].pop();if ((--cnt[idx]) == 0) {// 全部满足了就入队q.push(idx);}}}}for (int i = 0; i < n; i++) {if (cnt[i] != 0) {return false;}}return true;
}

1004

动态规划

解题思路

首先我们将筷子按升序排号,此时对于大部分的筷子,最优应该和相邻的配对,特殊情况是:当两个必须要拿的筷子之间隔了一双筷子,我们就要看这两个必须要拿的筷子是配成一双还是各自找其他的配对。

转移直接看代码就好了,特别要注意初始化。

CODE
std::pair<int, bool> c[N + 5];
i64 f[N + 5][2];void solve()
{int n = 0, m = 0;std::cin >> n >> m;for (int i = 1; i <= n; i++) {std::cin >> c[i].first;c[i].second = false;}for (int i = 0; i < m; i++) {int a = 0;std::cin >> a;c[a].second = true;}std::sort(c + 1, c + 1 + n);// 这些都是不存在的情况。f[0][0] = f[0][1] = f[1][1] = Inf;for (int i = 2; i <= n; i++) {if (c[i - 1].second) { // 第 i - 1 只必须拿f[i][0] = f[i - 1][1];f[i][1] = f[i - 1][0] + pow(c[i].first - c[i - 1].first, 2);}else {f[i][0] = std::min(f[i - 1][0], f[i - 1][1]);f[i][1] = std::min(f[i - 1][0] + i64(pow(c[i].first - c[i - 1].first, 2)), i64(f[i - 2][0] + pow(c[i].first - c[i - 2].first, 2)));}}std::cout << std::min(f[n][1], (c[n].second ? Inf : f[n][0])) << '\n';return;
}

1005

并查集

解题思路

并查集秒了

1007

可持久化字典树(明天再学)

1008

概率 扫描线

解题思路

要是抛开这题的期望,就单纯的求给定的区间内有多少不同的数,这就是一个比较板子的扫描线问题:模板题。实际上,本题的解法和思维难度就类似于模板题的 pro plus

假设现在我们有一段长度为 \(len\) 的区间,我们要计算在这个区间内随机选择一个的区间中包含的数的个数(包括相同的数)的期望。对于这个问题,答案的分母就是 \(len (len + 1) \over 2\),分母是 \(\sum_{i = 1}^{len}(i(len + 1 - i)) = {len(len + 1)(len + 2) \over 6}\)

若我们要求区间中包含的不同的数的个数的期望要怎么做呢?我们就减去分子中那些重复的数字的贡献就好了。具体的,我们令 \(l(r)\) 为小于 \(r\) 的最大位置使得 \(a[l(r)] = a[r]\),于是若 \(l[r]\)\(r\) 都在区间 \([L, R]\),我们就认为要减去 \(a[r]\) 对分子的贡献:\((l[r] - L + 1)(R - r + 1) = (r - 1)L + (l(r) + 1)R -LR - l(r)r + l(r) - r + 1\),可以发现,\(r\) 决定的是展开式中各项的系数。这是单个位置 \(r\) 需要减去的贡献,对于所有需要减去贡献的位置的总贡献,我们只需要统计各项系数的和再将具体的 \(L\)\(R\) 代入就好了。

CODE
constexpr int N = 2e5, X = 2e5;class BIT {
private:int n;std::vector<i64> tr;int lowbit(int x) {return x & -x;}i64 sum(int l) {i64 res = 0;while (l >= 1) {res += tr[l];l -= lowbit(l);}return res;}
public:BIT(int _n) : n(_n) {tr.assign(n + 1, 0ll);}void add(int pos, i64 val) {while (pos <= n) {tr[pos] += val;pos += lowbit(pos);}}i64 sum(int l, int r) {if (l > r) {return 0;}else {return (sum(r) - sum(l - 1)) % Mod;}}
};i64 qpow(i64 a, i64 p) {i64 res = 1;while (p) {if (p & 1) {(res *= a) %= Mod;}(a *= a) %= Mod;p >>= 1;}return res;
}
i64 inv(i64 a) {return qpow(a, Mod - 2);
}int a[N + 5], lst[N + 5], pos[N + 5];
i64 I[N + 5], A[N + 5];
i64 ans[N + 5];
std::vector qr(N + 5, std::vector<std::array<int, 2>>{});void solve()
{int n = 0, q = 0;std::cin >> n >> q;std::fill(pos + 1, pos + 1 + n, 0);for (int i = 1; i <= n; i++) {qr[i].clear();std::cin >> a[i];lst[i] = pos[a[i]];pos[a[i]] = i;}for (int i = 0; i < q; i++) {int l = 0, r = 0;std::cin >> l >> r;qr[r].push_back({ l, i });}BIT L(n), R(n), LR(n), C(n);for (int r = 1; r <= n; r++) {if (lst[r] != 0) {L.add(lst[r], r - 1);R.add(lst[r], lst[r] + 1);LR.add(lst[r], -1);C.add(lst[r], -1ll * lst[r] * r + lst[r] -  r + 1);}for (auto &[l, idx] : qr[r]) {ans[idx] = A[r - l + 1];(ans[idx] += Mod - (L.sum(l, r) * l + R.sum(l, r) * r + LR.sum(l, r) * l * r + C.sum(l, r)) % Mod) %= Mod;(ans[idx] *= I[r - l + 1]) %= Mod;}}for (int i = 0; i < q; i++) {std::cout << ans[i] << '\n';}
}int main()
{IOS;int _t = 1;std::cin >> _t;for (int i = 1; i <= N; i++) {I[i] = inv((1ll * (i + 1) * i / 2ll) % Mod); // 预处理分母A[i] = (1ll * i * (i + 1) * (i + 2) / 6ll) % Mod; // 预处理分子}while (_t--){solve();}system("pause");return 0;
}

1009

并查集

解题思路

最主要的一点就是,交换部落时,我们不真的去交换部落中所有的人,而是交换两个部落之间的编号(我们称之为实际编号),这就要求我们建立起实际编号与题目所给编号(我们称之为原始编号)之间的双射关系。

CODE
int fa[N + 5], pos[N + 5], idx[N + 5], g[N + 5];
int getfa(int u) {return u == fa[u] ? u : (fa[u] = getfa(fa[u]));
}
// u <- v;
void merge(int u, int v) {fa[getfa(v)] = getfa(u);;
}void solve()
{int n = 0, q = 0;std::cin >> n >> q;std::iota(fa + 1, fa + 1 + n, 1);std::iota(pos + 1, pos + 1 + n, 1);std::iota(idx + 1, idx + 1 + n, 1);std::iota(g + 1, g + 1 + n, 1);while (q--) {int op = 0;std::cin >> op;if (op == 1) { // 合并到 a 上int a = 0, b = 0;std::cin >> a >> b;merge(pos[a], pos[b]);}else if (op == 2) { // 移动 a 到部落 bint a = 0, b = 0;std::cin >> a >> b;g[a] = pos[b];}else if (op == 3) { // 交换 a b 两个部落int a = 0, b = 0;std::cin >> a >> b;std::swap(idx[pos[a]], idx[pos[b]]);std::swap(pos[a], pos[b]);}else { // 找 a 在那个部落int a = 0;std::cin >> a;std::cout << idx[getfa(g[a])] << '\n';}}
}

1010

(算思维?)

感觉是乱搞搞过去的。

CODE
void solve()
{int n = 0, m = 0;std::cin >> n >> m;std::vector d1(n, 0ll), d2(n, 0ll), d3(n, 0ll), d4(n, 0ll);for (int i = 0; i < n; i++) {i64 x = 0, y = 0;std::cin >> x >> y;d1[i] = x + y;d2[i] = x + Inf - y;d3[i] = Inf - x + Inf - y;d4[i] = Inf - x + y;}std::sort(d1.begin(), d1.end());std::sort(d2.begin(), d2.end());std::sort(d3.begin(), d3.end());std::sort(d4.begin(), d4.end());i64 ans = 2 * Inf;for (int i = 0; i < m; i++) {i64 x = 0, y = 0;std::cin >> x >> y;ans = std::min( ans, std::max({ abs(d1.back() - (x + y)), abs(d2.back() - (x + Inf - y)), abs(d3.back() - (Inf - x + Inf - y)), abs(d4.back() - (Inf - x + y)) }));}std::cout << ans << '\n';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/903604.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 事务失效

场景1:代码:执行结果:异常抛出,但是数据没有回滚。 代理对象调用 b() 方法 没有开启事务:普通对象调用a() 方法开启事务:在b() 方法上加入事务注解,开启事务就没问题:本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/18787133

征程 6X CAMSYS 性能测试方案介绍

1.性能测试方法原理 CAMSYS 其性能指标主要包括:帧率、延迟,以及系统的 DDR 带宽、CPU 占用率等。 对于帧率、延迟,通过在驱动中创建 trace event,分别记录通路上的每个 IP,每帧开始处理(frame_start)和结束处理(frame_end)的时间戳信息和帧信息,来实现帧率计算和延迟…

数据结构2

概率论与数理统计1-基本概念 概率论与数理统计2-基本数据结构 概率论与数理统计3-基本数据处理技术 基本的数据结构 - 数据结构- 数据的逻辑结构- 线性结构- 线性表- 栈(特殊的线性表)- 队列(特殊的线性表)- 字符串- 数组- 广义表- 非线性结构- 树型结构- 图型结构- 数据的存储…

day7 刷牛客华为机试题+学java

https://www.nowcoder.com/exam/oj/ta?page=1&tpId=37&type=37 字符串 第一题:第二题: 省行版:逻辑版:java网课学习: 多态调用成员变量,编译看左边,运行也看左边。调用成员方法时,编译看左边,运行看右边。if(a instanceof Dog d) 导包final 修饰引用类型地址…

【Docker】MySQL、Reids、Mongodb、Nacos、RabitMQ安装指南

1 docker的下载 建议通过 火绒应用商店 或者 联想应用商店 下载 2 配置Docker 配置镜像站 https://docker.1panel.live {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": fa…

Web前端入门第 22 问:CSS 选择器一览

HTML 在语法上并无大小限制,所以其结构可以浩瀚无边,CSS 选择器的作用则是在这些复杂的 HTML 结构中进行元素定位。 示例代码 记住此代码,后面所有的 css 选择器都是基于此代码。 注意:代码中存在两个一样的 id="p1" 元素,仅为了演示效果,正常编码中请保证 id …

曼哈顿距离和切比雪夫距离

曼哈顿距离(Manhattan Distance) 解释:只能横着或竖着走,坐标上两点的距离 假设存在两点 \(A(x_1, y_1)\) \(B(x_2, y_2)\) \(dis(A, B) = |x_1 - x_2| + |y_1 - y_2|\)对于上方求曼哈顿距离的式子,有四种情况 \( \begin{cases} x_1 > x_2 & y_1 > y_2 & {…

如何设置家用威联通 NAS UPS 断电后自动关机并通知其他设备?

场景📝备注: 求轻喷, 求放过. 😅 我真的是个理线方面的白痴. 这已经是我的极限了. 😂我的家庭实验室 Homelab 服务器集群配置如下.上半部分之前已经介绍过了, 这里就不再赘述了. 今天重点介绍介绍 UPS 和 NAS 部分.1台 UPS, 型号为 APC Back-UPS 650. 插座插着: NAS 和 插…

[扫描线] 数据结构测试(2025.3.22)

暴力大赛,赛时暴力打满喜提80pts,可惜T1没想到暴力。 难度:T2<T1<T3.T1 第1题 团队 查看测评数据信息有n个工人,第i个工人的能力是v[i], 他只与能力在L[i]到R[i]之间的人在一起工作,问最多能选出多少人在一起工作。输入格式第一行,一个整数n, 1 <= n <…

centOS 上部署hadoop+mysql+hive 服务之hadoop安装

以下安装的hadoop版本是3.3.6 ,由于hadoop是运行于java环境,因此,需要提前安装java jdk并配置环境变量。 jdk的安装及配置: jdk8 国内下载路径:https://repo.huaweicloud.com/java/jdk/8u202-b08/ 可根据实际需要选择对应的jdk版本 1、下载jdkwget https://repo.huaweicl…

创建django视图和路由

第一个视图 from django.shortcuts import render from django.http import HttpResponse# Create your views here. def hello(request):msg = Hello World!!!return HttpResponse(msg)第一个路由 from django.urls import path from .views import hellourlpatterns = [path(…

8.4.3 基于循环神经网络的字符级语言模型

字符级语言模型的优缺点见下 好处:不用担心\(\left<\text{UNK}\right>\)的出现 坏处:最终的序列要长的多;训练也要复杂得多(对内存和速度的要求都要高得多) 现如今,人们一般使用单词级RNN,但是也有特殊情况会使用字符级RNN 在训练了一个RNN后,我们可以利用这个RN…