12.28 CW 模拟赛 赛时记录

news/2024/12/28 15:58:34/文章来源:https://www.cnblogs.com/YzaCsp/p/18637574

前言

还是只管考试的策略, 别想其他的

每个题控制用时, 根据时间选择策略, 冷静

看题

完蛋了是 \(\rm{NOIP}\) , 我们没救了

\(\rm{T1}\)

怎么办, 像是很典的题但是我多半做不出来
别人做过容斥的肯定会, 但是我就不一样了

\(\rm{T2}\)

好像也不会做

\(\rm{T3}\)

基环树上的 \(\rm{dp}\) ?

\(\rm{T4}\)

有点像一位故人出的题

\(\rm{T1}\)

思路

题意非常清楚, 就是用 \(S\) 中的数字在 \([A, B]\) 区间中拼出 \(X\) 的倍数

你发现 \(A, B, X\)\(10^{11}\) 数量级的, 很不好做

有倍数条件的同时还有数字的约束, 不太好做

你发现如果 \(S\) 是满的, 那么相当于问在 \([A, B]\) 区间中有多少个 \(X\) 的倍数, 这个是好求的

考虑引入 \(S\) 的限制, 朴素的想法是枚举倍数判断是否拥有其他数字, 这个显然不够优秀, 考虑有没有优化的方法

好吧我不会了, 打个暴力看下给了多少

代码

#include <bits/stdc++.h>
#define int long longint X, A, B;
bool S[10];
int st; // 开始枚举的位置
int ans = 0;bool check(int x) {while (x) {if (!S[x % 10]) return false; x /= 10; }return true;
}signed main()
{scanf("%lld %lld %lld", &X, &A, &B);std::string a; std::cin >> a; for (int i = 0; i < a.length(); i++) S[a[i] - '0'] = true;st = (A % X) ? A / X + 1 : A / X; st *= X;for (int i = st; i <= B; i += X) {if (check(i)) ans++;if (clock() > 990) {printf("%lld", ans); return 0; }}printf("%lld", ans);return 0;
}

\(\rm{T2}\)

思路

这个题说不定比 \(\rm{T1}\) 可做?
好像明显有点畏难, 但是他一点提示没有不敢做

首先因为忘了欧氏距离是什么, 先玩一下样例

好的欧氏距离是, 对于两个点 \((x_1, y_1), (x_2, y_2)\) , 其欧氏距离 \(d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}\)

转化题意, 对于 \(n\) 个带权 \(k\) 的点, 任意两点 \(i, j\) 之间有双向连边, 其边权为 \(w_{i, j} = d_{i, j}\) , 求一最小阈值 \(C\) , 满足对于所有 \(w \leq C\) 的边连接后, 存在一个连通块 \(G\), 使得

\[\sum_{i = 1}^{\lvert G \rvert} (a_i \cdot k_i) \equiv 0 {\pmod K} , a_i \in \{0, 1\} \]

容易发现的是, 如果你要选择一些确定的点, 使其在同一连通块下, 那么你是可以求出最小阈值 \(C\) 的, 具体的, 我们可以二分之后 \(\rm{check}\) , 这个是 \(\mathcal{O} (n \log V)\) 的, 其中 \(V\) 是值域, 当然你也可以在确定 \(C\) 的情况下检查是否让老板开心

现在问题转化成了, 如何在一个图的连通块中, 判断是否可能有一些点的点权之和为 \(K\) 的倍数, 这个用可行性 \(\rm{dp}\) 可以解决

所以我们初步可以有一个暴力, 首先实数二分 \(V\) , 在这个基础上你把图的连通块跑出来 \(\mathcal{O} (n)\), 然后对于每个连通块进行可行性 \(\rm{dp}\)

好像还没说可行性 \(\rm{dp}\) 该怎么做

\(dp_{i, j}\) 表示考虑到第 \(i\) 个点权, 模 \(K\) 的结果是否能达到 \(j\) , 其中 \(dp_{i, j} \in \{0, 1\}\)

显然有转移

\[\begin{align*} dp_{i, j} \gets dp_{i - 1, j} \\ dp_{i, (j + k_i)} \gets dp_{i - 1, j} \end{align*} \]

其中 \(j\) 随时取模, 甚至可以滚掉 \(i\)


总结一下, 首先实数二分当前阈值 \(\mathcal{O} (\log V)\) , 然后跑当前图的情况和可行性 \(\rm{dp}\) \(\mathcal{O} (n\omega)\) , 其中 \(\omega = 30\) , 然后直接判断

总复杂度 \(\mathcal{O} (n \log V)\) , 可以通过本题

写的时候遇到了问题, 不能用 \(\mathcal{O} (n^2)\) 的方式建图, 我们需要在不计算原图的情况下找到连通块, 好像也不影响实现

实现

框架

实数二分, \(\rm{check}\) 比较复杂

代码

/*相信 O2 优化*/
#include <bits/stdc++.h>
// #define FILE_IO
#define int long long
const int MAXN = 5e4 + 20;
const double eps = 1e-4;
const int MAXVAL = 40;#define dist(a, b) sqrt((double)(p[a].x - p[b].x) * (p[a].x - p[b].x) + (p[a].y - p[b].y) * (p[a].y - p[b].y))int n, K;
struct node {int x, y, k;
} p[MAXN];int be[MAXN], cnt;
/*辅助处理连通块的 bfs*/
void bfs(int now, int divnum, double C) {be[now] = divnum;for (int i = 1; i <= n; i++) {if (be[i] || dist(now, i) - C > eps) continue;bfs(i, divnum, C);}
}std::vector<int> Div[MAXN];
/*在当前阈值情况下处理连通块*/
void divide(double C) {memset(Div, 0, sizeof(Div));for (int i = 1; i <= n; i++) be[i] = 0; cnt = 0;for (int i = 1; i <= n; i++) if (!be[i]) bfs(i, ++cnt, C);for (int i = 1; i <= n; i++) Div[be[i]].push_back(i);
}/*检查阈值是否合法*/
bool check(double C) {divide(C);/*在当前连通块中处理可行性 dp*/for (int k = 1; k <= cnt; k++) {bool flag = false; // 是否可以整除int now = 0, nxt = 1;int dp[2][MAXVAL][2]; memset(dp, false, sizeof(dp)); dp[now][0][0] = true;for (int i = 0; i < Div[k].size(); i++) {std::swap(now, nxt); memset(dp[now], false, sizeof(dp[now]));int nowk = p[Div[k][i]].k;for (int j = 0; j < 40; j++) {dp[now][j][0] |= dp[nxt][j][0];dp[now][j][1] |= dp[nxt][j][1];dp[now][(j + nowk) % K][1] |= dp[nxt][j][0];dp[now][(j + nowk) % K][1] |= dp[nxt][j][1];}if (dp[now][0][1]) flag = true;}if (flag) return true;}return false;
}/*二分答案*/
double binsearch() {double left = 0.0, right = 100000000.0;while (right - left > eps) {double mid = left + (right - left) / 2.0;if (check(mid)) right = mid;else left = mid;}return left;
}signed main()
{
#ifdef FILE_IOfreopen("connect_ex1.in", "r", stdin);freopen("connect_ex1.out", "w", stdout);
#endifscanf("%lld %lld", &n, &K);for (int i = 1; i <= n; i++) scanf("%lld %lld %lld", &p[i].x, &p[i].y, &p[i].k);// std::cout << check(1.3);double ans = binsearch();printf("%.3f", ans);return 0;
}

\(\rm{T3}\)

看起来很板的基环树上 \(\rm{dp}\) , 没时间做了

看起来也不能再写点什么了, 那就推推这个

套路的, 先考虑单棵树上怎么操作
\(f_{i, 0/1}\) 表示对于 \(i\) 的子树, 其中选不选当前点为关键点, 至少需要指定几个关键点才能符合要求

对于叶子节点的初始化是显然的, 考虑树形 \(\rm{dp}\) 的转移, 有

\[\begin{align*} f_{i, 0} \stackrel{k}{\longleftarrow} \left(\sum_{j = 1}^{\lvert son \rvert} f_{j, 0}\right) - f_{k, 0} + f_{k, 1} \\f_{i, 1} \stackrel{k}{\longleftarrow} \left(\sum_{j = 1}^{\lvert son \rvert} f_{j, 0}\right) - f_{k, 0} + f_{k, 1} \end{align*} \]

显然的, 这样子会漏统计一种情况 : 子树的根节点本来是没有关键点与之相连的, 但是在 \(i\) 为关键点的时候子树成立

这个时候我们朴素的考虑往上加一维表示这个子树是否有关键点与之相连, 反正如果隔了一层一定不成立, 所以这样做是有正确性的

考虑令 \(f_{i, 0/1, 0/1}\) 表示对于 \(i\) 的子树, 其中选不选当前点为关键点, 当前子树的直接儿子中有没有关键点

\[\begin{align*}\end{align*} \]

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

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

相关文章

『联合省选2025集训』『图的连通性进阶』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…

『联合省选2025集训』『耳分解,双极定向,三连通分量』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…

第七-八次作业总结

一、前言 该系列题目均为设计与实现一个家居强电电路模拟程序,题目难度复杂度逐步提升,题目数量和输入信息也逐步增加。以下是对这两道题的总结: 1. 知识点家居强电电路模拟程序-3 受控窗帘设备的模拟 多个并联电路串联在一起的情况 串联电路中包含其他串联电路的情况 家居强…

AD 原理图如何进行DRC检查

如果画到PCB才发现原理图画错了,那么就为时太晚了。 画完或者后期修改PCB应该及时进行原理图的DRC检查。 1. 右下角Panels打开工程: 2. 然后我们选中整个工程的工程处,点击右键: 3. 然后左键点击compile PCB Project......... : 参考资料: https://www.fanyedu.com/content…

Vue3甘特图 - dhtmlx-gantt

Vue3甘特图 <template><div style="height:100%; background-color: white"><div id="gantt_here" style="width:100%; height:100%;"></div></div> </template><script setup> import { onMounted }…

恍恍惚惚,走到了尾声

课程链接 https://edu.cnblogs.com/campus/fzu/SE2024/作业链接 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315作业目标 回顾自己的软工实践课程学号 102202157一、学期回顾 1.1 回顾你对于软件工程课程的想象在课程开始前,我一直以为软件工程课程会聚焦于各种编…

转正了!!!!!!!!

近期&感受、问题: 1.版本优化描述:秘境排行榜;一键探险功能的顺序;背包随机类宝箱一键开启;美食家一键合成闪光美食;电玩活动跳过动画功能;许愿池自动投币;结晶一键熔炼 感受/反思:感觉自己菜菜的QAQ,各种版本的本地数据处理错误(删早了删晚了/先notify后notify…

Navicat密码导出解密导入到DataGrip中

使用Navicat导出密码:目前使用Navicat17亲测有效使用php解密代码 <?php class NavicatPassword {protected $version = 0;protected $aesKey = libcckeylibcckey;protected $aesIv = libcciv libcciv ;protected $blowString = 3DC5CA39;protected $blowKey = null;protec…

鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用

随着HarmonyOS NEXT的正式推出,鸿蒙原生应用开发热度高涨,数量激增。但在三方应用鸿蒙化进程中,性能问题频出。为此,HarmonyOS NEXT推出了一整套原生页面高性能解决方案,包括Nodepool、HMrouter和DataCache 三大解决方案,并上架OpenHarmony开源社区,分别针对应用页面滑动…

数值计算方法(2) 数值积分方法

+++ date = 2024-12-21T13:49:00+08:00 draft = true title = 数值计算方法(2) 数值积分方法 +++ 初次发布于我的个人文档 上一期讲了插值方法,这一次自然是要运用一下插值方法了。所以这一期的主题是用插值方法计算定积分。 机械求积方法 下面我们来介绍一下怎么用插值法来得…

AI烟雾监测识别摄像机

AI烟雾监测识别摄像机的应用范围广泛,不仅可以安装在家庭、商业建筑、工厂等场所,还可以应用于地铁、火车站等公共场所,为人们的生命财产安全提供全方位的保障。总的来说,AI烟雾监测识别摄像机作为智能化安全防范的重要工具,具有广阔的应用前景和社会意义。通过提高火灾预…

Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件

Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件 Omnissa Horizon,之前称为 VMware Horizon, 通过高效、安全的虚拟桌面交付增强您的工作空间 请访问原文链接:https://sysin.…