Educational Codeforces Round 47 (Rated for Div

news/2024/12/18 19:11:58/文章来源:https://www.cnblogs.com/pei-solution/p/18615718

Educational Codeforces Round 47 (Rated for Div. 2)

A. Game Shopping

​ 暴力模拟即可

#include <bits/stdc++.h>using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'inline void solve() {int n, m;cin >> n >> m;vector<int> arr(n + 1);for (int i = 1; i <= n; i++)cin >> arr[i];queue<int> q;for (int i = 1; i <= m; i++) {int x;cin >> x;q.push(x);}int ans = 0;for (int i = 1; i <= n; i++) {if (q.empty())break;if (arr[i] <= q.front()) {ans++;q.pop();}}cout << ans << endl;
}signed main() {
#ifdef ONLINE_JUDGE
#elsefreopen("test.in", "r", stdin);freopen("test.out", "w", stdout);
#endifios::sync_with_stdio(0);cout.tie(0);cin.tie(0);int t = 1;
//    cin >> t;while (t--)solve();return 0;
}

B. Minimum Ternary String

​ 观察题目可以发现每次移动可以看作只有1在左右移动,0与2不能交换位置,所以最总答案是把所有1聚在一块原本0和2的位置不发生改变,于是问题变为把1插在哪里使得字符串字典序最小,显然插在第一个不是0的位置前即可

#include <bits/stdc++.h>using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'inline void solve() {string s;cin >> s;string ans;int cnt = 0;for (auto c: s) {if (c == '1') ++cnt;else ans += c;}int n = ans.size();int pos = -1;while (pos + 1 < n && ans[pos + 1] == '0') ++pos;ans.insert(pos + 1, string(cnt, '1'));cout << ans << endl;
}signed main() {
#ifdef ONLINE_JUDGE
#elsefreopen("test.in", "r", stdin);freopen("test.out", "w", stdout);
#endifios::sync_with_stdio(0);cout.tie(0);cin.tie(0);int t = 1;
//    cin >> t;while (t--)solve();return 0;
}

C. Annoying Present

​ 由于每一个位置都会加上\(x_i\)所以x与选择的位置没有关系,那么来讨论选择位置与\(d_i\)的关系。稍微计算一下可也得到

​ · 如果\(d_i\le0\)在数组的中点位置可以确保总和最大

​ · 如果\(d_i>0\)那么在数组的左右端点处可以确保总和最大

​ 由此可以得到结果

#include <bits/stdc++.h>using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'inline void solve() {int n, q;cin >> n >> q;int sum = 0;while (q--) {int x, d;cin >> x >> d;sum += x * n;if (d < 0) {int cnt = (n - 1) / 2;sum += (cnt * d + d) * cnt + (n % 2 == 0) * (cnt * d + d);} else {int cnt = n - 1;sum += (d + cnt * d) * cnt / 2;}}double ans = 1.0 * sum / n;cout << fixed << setprecision(12) << ans << endl;
}signed main() {
#ifdef ONLINE_JUDGE
#elsefreopen("test.in", "r", stdin);freopen("test.out", "w", stdout);
#endifios::sync_with_stdio(0);cout.tie(0);cin.tie(0);int t = 1;
//    cin >> t;while (t--)solve();return 0;
}

D. Relatively Prime Graph

​ 首先观察数据发现\(n,m\leq10^5\)由于边的上限是\(10^5\)那么简单打表一下可以发现当\(n=600时\),可以连的边就已经大于\(10^5\)了,而暴力枚举只需要\(n^2\)的复杂度那么,如果对于所有数直接暴力枚举即可

​ 需要特判,如果边小于点的个数减一即\(m<n-1\)那么无法构造出一个n点m边的图输出\(Impossible\)

#include <bits/stdc++.h>using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'inline void solve() {int n, m;cin >> n >> m;vector<PII > ans;if (m < n - 1) {puts("Impossible");return;}for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) {if (__gcd(i, j) == 1)ans.push_back(make_pair(i, j));if (ans.size() == m)break;}if (ans.size() == m)break;}if (ans.size() == m) {cout << "Possible\n";for (auto [x, y]: ans)cout << x << ' ' << y << endl;} else cout << "Impossible\n";
}signed main() {
#ifdef ONLINE_JUDGE
#elsefreopen("test.in", "r", stdin);freopen("test.out", "w", stdout);
#endifios::sync_with_stdio(0);cout.tie(0);cin.tie(0);int t = 1;
//    cin >> t;while (t--)solve();return 0;
}

E. Intercity Travelling

​ 题目中实际上每次是从1号点开始移动

​ 乘以\(2^{n-1}\)相当于把原本计算的期望的分母消了,所以计算所有可能得难度和即可

​ 设\(pos\)假设在\(pos\)点位置产生了\(a_i\)的难度贡献,那么说明在\((pos-i,pos)\)这个区间内不存在休息点而其余位置不管有没有休息点都可以那么对于每一个满足条件的\(pos,pos\in[i,n]\)都会产生\(a_i\)的难度贡献,注意

​ ·当\(i = pos\)的时候区间左端点被固定,产生的贡献为\(a_i\cdot 2^{n-i}\)

​ ·当\(i\neq pos\)的时候区间左右都没有被固定,但是需要排除\(i=pos\)的情况,所以产生的贡献就是\(a_i\cdot (n - i)\cdot 2^{n-i-1}\)

​ 综上答案通式为\(ans=\sum_{i=1}^n(2^{n-i}+(n-i)\cdot2^{n-i-1})\cdot a_i\)

#include <bits/stdc++.h>using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'
const int mod = 998244353;inline void solve() {int n;cin >> n;int ans = 0;vector<int> num(n + 1);num.front() = 1;for (int i = 1; i <= n; i++)num[i] = (num[i - 1] * 2) % mod;for (int i = 1; i <= n; i++) {int x;cin >> x;ans = (ans + (num[n - i] + (n - i) * num[n - i - 1]) % mod * x % mod) % mod;}cout << ans << endl;
}signed main() {
#ifdef ONLINE_JUDGE
#elsefreopen("test.in", "r", stdin);freopen("test.out", "w", stdout);
#endifios::sync_with_stdio(0);cout.tie(0);cin.tie(0);int t = 1;
//    cin >> t;while (t--)solve();return 0;
}

F. Dominant Indices

​ 题目大意为:给定一棵以1为根节点的有n个节点的树,设\(f(x,i)为x子树中到x距离为i的节点数\),对于每个点求一个最小的\(k,使得f(x,k)最大。(1\leq n\leq 10^6)\)

​ 暴力思想:用\(f[x][i]\)表示在x子树内与x距离为i的节点数,暴力枚举\(\sum_{y\in son[x]}f[y][i-1]\)\(n^2\)的复杂度会\(TLE\)

​ 用长链剖分进行优化

​ 1.先搜索重儿子,搜完一条链上的重儿子,回溯时,先让父节点继承重儿子答案,

​ 2.再搜索轻儿子,回溯时,暴力合并轻儿子上的信息,然后更新答案

​ 如果\(f数组\)开成\(N^2\)空间会炸掉。可以巧妙的通过指针给每个节点动态分配内存才来解决这个问题

#include <bits/stdc++.h>using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'
const int mod = 998244353;
const int N = 1e6 + 7;
vector<int> e[N];
int son[N], len[N];
int buf[N], *f[N], *p = buf, ans[N];
//buf相当于f数组的第二维
//*f则是f数组的第一维
//f[i][j]第一维表示节点信息,第二维表示距离
void dfs(int x, int fa) {for (int y: e[x]) {if (y == fa)continue;dfs(y, x);if (len[son[x]] < len[y])son[x] = y;//dfs跑长儿子}len[x] = len[son[x]] + 1;
}void dp(int x, int fa) {f[x][0] = 1;//到本身距离为0的点是本身if (son[x]) {//优先跑长链,后续答案向长链上合并f[son[x]] = f[x] + 1;//共享内存,拷贝数组dp(son[x], x);ans[x] = ans[son[x]] + 1;//继承长儿子节点答案}for (int y: e[x]) {if (y == fa || y == son[x])continue;f[y] = p,p += len[y];//给y开头的链申请空间dp(y, x);for (int j = 1; j <= len[y]; j++) {f[x][j] += f[y][j - 1];//累加所有子节点状态if (f[x][j] > f[x][ans[x]] || (f[x][j] == f[x][ans[x]] && j < ans[x]))//第一种为节点数更多,第二种则为k值更小ans[x] = j;}}if (f[x][ans[x]] == 1)ans[x] = 0;//唯一节点为本身
}inline void solve() {int n;cin >> n;for (int i = 1; i < n; i++) {int x, y;cin >> x >> y;e[x].push_back(y);e[y].push_back(x);}dfs(1, 0);f[1] = p,p += len[1];//为根节点申请空间dp(1, 0);for (int i = 1; i <= n; i++)cout << ans[i] << "\n";
}signed main() {
#ifdef ONLINE_JUDGE
#elsefreopen("test.in", "r", stdin);freopen("test.out", "w", stdout);
#endifios::sync_with_stdio(0);cout.tie(0);cin.tie(0);int t = 1;
//    cin >> t;while (t--)solve();return 0;
}

如有不懂请看董晓老师的b站视频讲解 D34【模板】长链剖分 CF1009F Dominant Indices

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

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

相关文章

MOS管的寄生电容

我们经常看到,在电源电路中,功率MOS管的G极经常会串联一个小电阻,几欧姆到几十欧姆不等,那么这个电阻用什么作用呢? 这个电阻的作用有2个作用:限制G极电流,抑制振荡。 限制G极电流MOS管是由电压驱动的,是以G级电流很小,但是因为寄生电容的存在,在MOS管打开或关闭的时…

配置CentOS 7阿里yum源

备份yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bakvi /etc/yum.repos.d/CentOS-Base.repo# CentOS-Base.repo # # The mirror system uses the connecting IP address of the client and the # update status of each mirror to …

源码信息收集

引子:上一篇主要介绍了与Web架构相关的信息收集,而在Web架构中有一至关重要的一环,那就是源码。Web应用中美观的ui、特色的功能全靠源码来实现,但同样的,几乎绝大多数与Web相关的漏洞都也都与其源码有关。而本篇则介绍几种常见的源码信息收集方式。附:完整笔记目录~ ps:…

标定和定位的关系

手眼标定手眼标定可以利用某真值位置和传感器观测位置对比得到外参。 关联本质上是外参不同引起的看同一外接参照物,认为自身运动轨迹的不同。位置如上观测同一建筑(三角形,上顶点是北方),真实轨迹(左图):是向北直行是在向正前方走世界坐标系->偏置传感器轨迹(中间图…

12.13

实验2 熟悉常用的HDFS操作1.实验目的 (1)理解HDFS在Hadoop体系结构中的角色; (2)熟练使用HDFS操作常用的Shell命令; (3)熟悉HDFS操作常用的Java API。 2. 实验平台 (1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04); (2)Hadoop版本:3.1.3; (3)JDK版本:1.…

12.10

实验八:随机森林算法实现与测试一、实验目的 深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容 (1)从 scikit-learn 库中加载 iris 数据集,使用留出法…

Tengine:Nginx二次开发-高性能进化

前言:在当今的互联网时代,Web 服务器的性能和稳定性对于网站的成功至关重要。Nginx 以其高性能和可扩展性而闻名,但有时候,我们需要更多的特性来满足特定的业务需求。Tengine,作为一个由淘宝网发起的 Nginx 二次开发版本,不仅继承了 Nginx 的所有特性,还添加了许多高级功…

【亲测能用】专业科学图形和数据分析软件:OriginPro 2024(附绿色补丁+安装教程)

软件介绍 OriginPro 2024是一款先进的数据分析和图形绘制工具,它在科研、工程、商业和生物医学等多个领域中被广泛采用。这款软件支持导入和导出多种数据格式,例如Excel、CSV和文本文件,使得数据处理变得简单快捷。它不仅提供数据清洗、转换和统计分析功能,以提升数据的准确…

Spring MVC与Swagger常用注解

Swagger工作原理 Swagger的核心功能之一就是通过注解来描述接口和模型,从而生成文档。 Swagger基于springfox-swagger2和springfox-swagger-ui依赖库,进行自动扫描Spring框架,并生成相应的API文档‌。 Spring MVC是Spring框架主要重要的部分,专门用于构建web应用,遵循MVC设…

深度学习基础理论————学习率优化方法(AdaGrad/RMSprop/Adam/Warm-UP)

学习率基础[1] 学习率(Learning Rate)在优化算法,尤其是梯度下降和其变体中,扮演着至关重要的角色。它影响着模型训练的速度和稳定性,并且是实现模型优化的关键参数之一。如何理解呢?在统计学中,线性方程的优化过程通常包括以下步骤:构建方程:定义一个模型,例如线性方…