Codeforces Round 953 Div.2 F 题解

news/2024/10/3 21:17:44

连通块计数的一种常见思路是钦定代表元,但发现这题的连边方式并不好指定一个代表元,那么只能尝试优化建图。

我们尝试观察一下连边的情况,通过手玩样例获得一些几何直观的感受:

3 4 5
5 3 4
4 5 3

这个样例也许比较小,不过你真的把边画出来就会发现:连边形如 \(2n-1\) 条完整的斜线,中间零散地连了一些边。

其实很有道理,斜线上相邻两个元素距离为 \(2\),而 \(k\ge 2\),故能形成连边。

然后我们只需要考虑斜线之间的连边。根据曼哈顿距离转切比雪夫距离的原理,我们发现,两条斜线之间的距离就是它们的编号之差。(表述可能不清,假设从左下到右上编号依次为 \(1,2,\dots,2n-1\),那么 \(dis(i, j)=|i-j|)\))。

于是我们只需要考虑序列上的情况。这是一个相对经典的问题,对于每个质数,分别维护最后一次出现的位置 \(lst_v\),假设 \(v\)\(a_i\) 的因子,且 \(i-lst_v\le k\),连边 \((i,lst_v)\) 即可。时间复杂度 \(\mathcal O(n\log\log n)\)。不过我写的很粗糙,不是这个复杂度。

写完发现寄了,原因是没有考虑 \(1\) 没法形成斜线,因为 \(1\) 同样不会参与斜线之间的连边,直接特殊处理一下就行。

#include <bits/stdc++.h>
#define pb emplace_back
#define fir first
#define sec second
#define Tp template <typename T>using i64 = long long;
using pii = std::pair<int, int>;Tp T myabs(T x) { return x > 0 ? x : -x; }constexpr int maxn = 1e6 + 5, N = 1e6;
int n, a[maxn << 1], k, pre[maxn << 1], lst[maxn];
std::vector<int> pr[maxn];int find(int x) { return x == pre[x] ? x : pre[x] = find(pre[x]); }void work() {std::cin >> n >> k;std::fill(a + 1, a + 2 * n, 0);for (int i = 1; i <= n; ++i) {std::cin >> a[n - 1 + i];}for (int i = 1; i < n; ++i) {a[n - i] = a[2 * n - i];}i64 ans = 0;for (int i = 1; i <= 2 * n - 1; ++i) {if (a[i] > 1) continue;ans += n - myabs(n - i) - 1;}std::iota(pre + 1, pre + 2 * n, 1);for (int i = 1; i <= 2 * n - 1; ++i) {for (auto& v : pr[a[i]]) {if (lst[v] && i - lst[v] <= k) {pre[find(i)] = find(lst[v]);}lst[v] = i;}}for (int i = 1; i <= 2 * n - 1; ++i) {for (auto& v : pr[a[i]]) {lst[v] = 0;}}int cnt = 0;for (int i = 1; i <= 2 * n - 1; ++i) {cnt += find(i) == i;}std::cout << (i64)cnt + ans << '\n';return;
}int main() {std::cin.tie(nullptr)->sync_with_stdio(false);for (int i = 2; i <= N; ++i) {if (pr[i].empty()) {for (int j = i; j <= N; j += i) {pr[j].pb(i);}}}int t;std::cin >> t;while (t--) work();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Docker系列 V1 - 在 Ubuntu 24.04 LTS 上安装 Docker

在 Ubuntu 24.04 LTS 上,虽然可以通过 Ubuntu 的官方仓库直接安装 Docker,但是这种方法通常无法获取到最新的 Docker 版本,而且安全更新也可能延迟。 因此,推荐从 Docker 的官方仓库进行安装,确保可以用上最新版本并和自动更新。 第 1 步:更新软件包并安装必要软件 运行以…

【JavaWeb】SpringBootWeb请求响应

前言 在上一次,我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用,浏览器发起请求 /hello 后 ,给浏览器返回字符串 “Hello World ~”。其实呢,是我们在浏览器发起请求,请求了我们的后端web服务器(也就是内置的Tomcat)。而我们在开发web程序时呢,…

llm-universe - 1

Smiling & Weeping---- 难怪春迟迟不来,原来是我把雪一读再读一、大型语言模型(LLM)理论简介 1 大型语言模型(LLM)的概念 大语言模型(LLM,Large Language Model),也称大型语言模型,是一种旨在理解和生成人类语言的人工智能。 LLM 通常指包含数百亿(或更多)参数…

Git学习记录v1.0

1、常用操作git clone git config git branch gitt checkout git status git add git commit git push git pull git log git tag1.1 git clone 从git服务器拉取代码 git clone https://gitee.com/xxx/studyJava.git1.2 git config 配置开发者用户名和邮箱 git config user.nam…

魔法披风

或许我的故事即将迎来结局了吧頑張って

17岁中专女生,闯进全球数学竞赛12强

今年阿里的数学竞赛结果出来了,在榜单的前列包含一个 17 岁的中专女生。 在 2018 年时,阿里巴巴达摩院发起了一个国际数学竞赛,基本每年举办一次,参赛不设报名条件,向全球所有数学爱好者开放,竞赛由阿里创始人马云发起。入口:https://damo.alibaba.com/alibaba-global-m…

【Nginx】Nginx部署前端静态资源

打包部署 我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步:前端工程打包 通过nginx服务器(点击下载Nginx)发布前端工程1 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的build按钮来完整,如下图所示,直接点…

BUUCTF-Misc(151-160)

[DDCTF2018]第四扩展FS binwalk提取一下然后提取出来一个加密压缩包,密码就在图片的备注里Pactera提取出来是一个文本字频统计得到flagflag{huanwe1sik4o!}Beautiful_Side 010editor打开,发现一个png文件,我们提取出来发现是半张二维码然后打开QRazyBox - QR Code Analysis …