Codeforces Round 988 (Div. 3) 补题记录(A~G)

news/2024/11/18 2:05:53/文章来源:https://www.cnblogs.com/yhbqwq/p/18551495

总结:赛时一题不会,赛后光速 AK

A

namespace Triple_Light {int a[N];
void run() {int T = read();while (T--) {int n = read();int buc[30] = {0};for (int i = 1; i <= n; ++i) {int x = read();++buc[x];}int cnt = 0;for (int i = 1; i <= n; ++i) {cnt += buc[i] / 2;}cout << cnt << '\n';}
} }

B

首先可以知道 \(n\times m=k-2\),又因为 \(k-2\) 很小,所以直接暴力分解 \(k-2\) 的因数,判断是否可以拆分为 \(h\times w=k-2\) 且满足 \(a\) 中恰好存在 \(h\)\(w\) 即可。特殊的,需要特判 \(h=w\) 的情况。

总时间复杂度为 \(O(k)\)

namespace Triple_Light {int a[N], vis[N];
void run() {int T = read();while (T--) {int n = read();for (int i = 1; i <= n; ++i) {vis[i] = 0;}for (int i = 1; i <= n; ++i) {a[i] = read();++vis[a[i]];}int kx = n - 2;for (int i = 1; i * i <= kx; ++i) {if (kx % i == 0) {int a = kx / i, b = i;if (a == b) {if (vis[a] >= 2) {cout << a << ' ' << b << '\n';break;}} else {if (vis[a] && vis[b]) {cout << a << ' ' << b << '\n';break;}}}}}
} }

C

顶好玩的构造题。首先大于 \(4\) 的偶数肯定是合数,也就是说一堆奇数和偶数肯定是满足条件的。问题是奇数和偶数之间的地方,考虑让其的和可以被 \(3\) 整除,直接令奇数最后一个是最大的奇数,然后暴力枚举合法的可以衔接的偶数即可。对于 \(n\) 很小的情况可以直接暴搜全排列,总时间复杂度为 \(O(n)\)

namespace Triple_Light {int a[N], vis[N];
void run() {int T = read();while (T--) {int n = read();for (int i = 1; i <= n; ++i) {vis[i] = 0;}for (int i = 1; i <= n; ++i) {a[i] = read();++vis[a[i]];}int kx = n - 2;for (int i = 1; i * i <= kx; ++i) {if (kx % i == 0) {int a = kx / i, b = i;if (a == b) {if (vis[a] >= 2) {cout << a << ' ' << b << '\n';break;}} else {if (vis[a] && vis[b]) {cout << a << ' ' << b << '\n';break;}}}}}
} }

D

首先若跨越了第 \(i-1\) 个障碍,则肯定能够到达 \(l_i-1\)。如果不选能从 \(l_i-1\) 直接到达 \(r_i+1\) 那么肯定不选,否则暴力枚举当前所有可以选择的装备并贪心的选择可以移动距离最大的装备,直到当前可以从 \(l_i-1\) 跳到 \(r_i+1\) 为止。维护当前可选的装备可以用堆维护,时间复杂度为 \(O(n\log n)\)

namespace Triple_Light {int l[N], r[N], x[N], v[N];
void run() {int T = read();while (T--) {int n = read(), m = read(), L = read();for (int i = 1; i <= n; ++i) {l[i] = read();r[i] = read();}for (int i = 1; i <= m; ++i) {x[i] = read();v[i] = read();}int pos = 1;priority_queue<int> q;int now = 1, cnt = 0, ok = 1;for (int i = 1; i <= n; ++i) {while (pos <= m && x[pos] < l[i]) {q.push(v[pos]);++pos;}int len = r[i] - l[i] + 2;if (now < len) {while (q.size()) {int t = q.top();q.pop();now += t;++cnt;if (now >= len) {break;}}if (now < len) {ok = 0;break;}}}if (ok) {cout << cnt << '\n';} else {cout << "-1\n";}}
} }

E

首先考虑手摸一下寻找线索,可以发现若每一次都按照顺序询问一个前缀,则在一开始询问到一堆 \(0\) 之后在 \(i\) 位置得到了一个非零数 \(x\),则:

  • \(a_x=1\)
  • \(a\) 数组中存在一个长度为 \(x\) 的全 \(1\) 前缀。
  • 其余在 \([1,x]\) 前缀内的位置的值全都为 \(0\)

然后对于后面仍然询问前缀,若当前询问到前缀和上一次询问前缀的答案相同,则当前位结尾对答案没有贡献,即当前位为 \(0\),否则因为前面一定存在 \(0\)(否则第一次不能询问出非 \(0\) 值),当前位对答案产生贡献,则当前位为 \(1\)

特殊的,若没有找到一个非 \(0\) 的前缀,则输出 IMPOSSIBLE

总时间复杂度为 \(O(n)\),询问 \(n-1\) 次,符合题目条件。

namespace Triple_Light {int a[N];
void run() {int T = read();while (T--) {int n = read(), pos = 1;for (int i = 1; i <= n; ++i) {a[i] = -1;}int la = 0;for (int i = 2; i <= n; ++i) {cout << "? " << pos << ' ' << i << endl;int o ; cin >> o;int to = o;if (o != la) {if (!la) {o -= la;a[i] = 1;int j, k;for (j = i - 1, k = 1; k <= o; --j, ++k) {a[j] = 0;}for (; j >= pos; --j) {a[j] = 1;}la = to;} else {a[i] = 1;la = to;}} else if (la) {// cout << "qwq " << i << '\n';a[i] = 0;}}if (count(a + 1, a + n + 1, -1)) {cout << "! IMPOSSIBLE" << endl;} else {cout << "! ";for (int i = 1; i <= n; ++i) {cout << a[i];}cout << endl;}}
} }

F

笑点解析:已被删除

考虑经典套路,二分一个答案 \(x\) 判断其是否合法。考虑二分完之后计算每一个怪物可以在攻击 \(x\) 轮之后去世的区间 \([L_i,R_i]\),然后在数轴上建立扫描线模型,设 \((x,o)\) 表示 \(x\) 位置中线段数量会增加 \(o\)(若 \(o\) 为负数则为减少 \(-o\)),因此只需要添加 \((L_i,1)\)\((R_i+1,-1)\)。然后对扫描线按照坐标从小到大排序并判断是否存在一个前缀满足该前缀内所有 \(o\) 的和超过了 \(k\) 即可。

总时间复杂度为 \(O(n\log n)\),可以通过。

namespace ttq012 {int h[N], x[N];
void run() {int T = read();while (T--) {int n = read(), m = read(), k = read();for (int i = 1; i <= n; ++i) {h[i] = read();}for (int i = 1; i <= n; ++i) {x[i] = read();}int l = 1, r = inf, best = -1;while (l <= r) {int mid = l + r >> 1;vector<pair<int, int>> event;for (int i = 1; i <= n; ++i) {int pwk = (h[i] + mid - 1) / mid;if (pwk <= m) {int L = x[i] - (m - pwk), R = x[i] + (m - pwk);event.eb(L, 1), event.eb(R + 1, -1);}}sort(event.begin(), event.end(), [&](auto l, auto r) {return l.first < r.first || l.first == r.first && l.second < r.second;}) ;int pref = 0, ok = 0;for (auto &[pos, vx] : event) {if ((pref += vx) >= k) {ok = 1;break;}}if (ok) {best = mid, r = mid - 1;} else {l = mid + 1;}}cout << best << '\n';}
} }

G

看到 \(\gcd\neq 1\) 可以快速想到莫比乌斯函数容斥答案,于是设 \(f_i\) 表示从第 \(1\) 个数移动到第 \(i\) 个数的不同路径数量,显然有 dp 转移式:

\[f_i=\sum\limits_{j=1}^{i-1}[\gcd(a_i,a_j)\neq 1]f_j \]

但是直接转移时间复杂度为 \(O(n^2\log n)\),显然无法通过。考虑设 \(g_i\) 表示在值域上,当前为 \(i\) 的倍数的 \(a_i\) 所代表的 \(f_i\) 的值的和,则可以使用莫比乌斯函数对答案容斥,有:

  • \(f_1=1\)
  • \(f_i=-\sum\limits_{x\mid a_i}\mu(x)g_x\)\(i>1\)
  • \(g_x\leftarrow g_x+f_i\)\(x\mid a_i\)

欧拉线性筛出 \(\mu\) 函数的值,然后直接 dp 时间复杂度为 \(O(n^\frac{3}{2})\),使用 Pollard-Rho 分解质因数可以优化到 \(O(n^\frac{5}{4})\)。但是可以一遍埃筛得到每一个数的因数,做到 \(O(n\log n)\)

namespace ttq012 {int a[N], mu[N], idx, pr[N], isp[N];
void sieve(int n) {isp[1] = 1, mu[1] = 1;for (int i = 2; i < n; ++i) {if (!isp[i]) {pr[++idx] = i, mu[i] = -1;}for (int j = 1; j <= idx && i * pr[j] < n; ++j) {int k = i * pr[j];isp[k] = 1;if (i % pr[j] == 0) {mu[k] = 0;break;} else {mu[k] = -mu[i];}}}
}
int f[N], g[N];
void run() {sieve(N);int n = read();for (int i = 1; i <= n; ++i) {a[i] = read();}for (int i = 1; i <= n; ++i) {vector<int> fact;for (int j = 2; j * j <= a[i]; ++j) {if (a[i] % j == 0) {fact.eb(j);if (j * j != a[i]) {fact.eb(a[i] / j);}}}fact.eb(a[i]);if (i == 1) {f[i] = 1;} else {for (auto &x : fact) {f[i] = (f[i] - mu[x] * g[x] % mod + mod) % mod;}}for (auto &x : fact) {g[x] = (g[x] + f[i]) % mod;}}cout << f[n] << '\n';
} }

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

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

相关文章

【圆圆的日语教室】日语入门第2课-平假名的书写+了解日本

第二课 相似的假名平假名的书写あ (a) 的书写第二笔不要太直,它是从草书演变过来的,特点是圆润有弧度 第三笔要交叉 长得像“安”い (i) 的书写第一笔要勾上去う (u) 的书写第一笔:点第二笔:起笔不要太平,先往上走再往下拐。联想记忆:u住耳朵え (e) 的书写联想:e,见到一…

Scrum 冲刺博客-day3

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 Scrum 冲刺博客-day3团队成员 梁志聪 李永杰 曾繁曦一、会议照片二、工作情况成员 昨天已完成工作 今日计划工作梁志聪 编写主菜单,人物移动相关代码 设计障碍物,实现人物碰撞李永杰 构思大…

基于RDK X5的智慧交通监控系统

本Blogs同步发表至CSDN:https://blog.csdn.net/xiongqi123123/article/details/143840675?sharetype=blogdetail&sharerId=143840675&sharerefer=PC&sharesource=xiongqi123123&spm=1011.2480.3001.8118 一、项目背景在当前高等教育普及化、大学持续扩招的宏…

【ai+模型】五大主流开源大模型RAG评估框架详解

RAG 评估的挑战 增强检索生成技术(Retrieval Augmented Generation,简称 RAG)目前正成为增强大语言模型(LLM)性能的核心手段。该技术通过将外部知识库融入LLM,大幅提升了大模型的精确度和对上下文的感知力。然而,对 RAG 系统性能的评测颇具挑战,这促使了一系列开源 RAG…

【待发】CyberEdge:简洁而强大的互联网资产测绘工具

免责声明 利⽤本文所提供的信息而造成的任何直接或者间接的后果及损失,均由使⽤者本⼈负责,创作者及作者不为此承担任何责任,一旦造成后果请自行承担责任!简介: CyberEdge是一款精心设计的互联网资产测绘工具,为网络安全专业人士提供精准、高效的扫描体验。 核心特性: 全…

Spring Security 认证授权(黑马讲义)

1.基本概念 1.1.什么是认证 用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。 1.2.什么是授…

SkyWalking 安装部署操作指引

环境 CentOS-7-x86_64-DVD-2009.iso https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso apache-skywalking-apm-10.0.1.tar.gz https://dlcdn.apache.org/skywalking/10.0.1/apache-skywalking-apm-10.0.1.tar.gz jdk-11.0.23_linux-x64_bin.tar.…

Win11 24H2 使用Rclone将SMB协议链接转为本地磁盘驱动器

9月份升级了ITX主机,多了好几块机械硬盘, 后来又买了Nas, 先装了飞牛Nas系统, 结果要格盘,考虑到Refs, Zfs, exFAT 在坏盘情况对数据恢复不友好, 决定改用Win11作为Nas 系统 .Windows 做Nas 系统不要太好, 免去各类docker 的缓慢和配置,可以正常使用迅雷等各类软件,并且很多Nas…

在Keil中使用ST-LINK烧录STM32程序指南

前言 之前玩STM32都是用J-LINK烧录程序,不仅便捷,而且烧录的速度比用串口快好多。 最近我接了几个32单片机的毕设单子,便买了几块C8T6的最小系统板用来开发。最初我还是用J-LINK烧录C8T6的,只要从J-LINK中找出对应的引脚用杜邦线连上就可以烧录,但是每晚要去学校的实验室,…

第八章习题

学号后四位:3018 8.4:点击查看代码 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt# 定义微分方程组 def differential_equations(state, t):x, y = statedxdt = -x ** 3 - ydydt = x - y ** 3return [dxdt, dydt]# 设定初始条件 ini…

Next App Router 模式下,如何同步服务端 Redux 初始状态?

大家的阅读是我发帖的动力,本文首发于我的博客:deerblog.gu-nami.com/,欢迎大家来玩,转载请注明出处喵。🎈前言 Next.js 是一个广受欢迎的 React 服务端渲染(Server Side Rendering,SSR)框架。Next.js 的页面会先在服务端渲染一次,然后把结果传给浏览器,也就是客户端…

Git版本管理系统快速上手指南

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.git命令初体验1.搭建Golang开发环境2.git init项目初始化3.git status查看工作目录状态4.git add将文件从工作区提交到暂存区5.git config配置git个人信息6.git commit提交代码到本地仓库7.git log查看…