牛客周赛 Round 62(期望、DFS、主席树、DP、逆推DP)

文章目录

  • 牛客周赛 Round 62(期望、DFS、主席树、DP、逆推DP)
    • A. 小红的字符移动
    • B. 小红的数轴移动
    • C. 小红的圆移动
    • D. 小红的树上移动 (期望、DFS)
    • E. F. 小红的中位数查询(主席树)
    • G. 小红的数轴移动(二)(DP、逆推DP)

牛客周赛 Round 62(期望、DFS、主席树、DP、逆推DP)

A. 小红的字符移动

交换前两个元素的位置即可。

#include<bits/stdc++.h>
using namespace std;int main() {string s;cin >> s;swap(s[0], s[1]);cout << s << endl;return 0;
}

B. 小红的数轴移动

根据题意模拟即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;int main() {ll n, x;cin >> n >> x;ll res = 0, s;while(n--){if(x == 0) break;cin >> s;res += s;if(x > 0) x -= s;else x += s;}cout << res << endl;	return 0;
}

C. 小红的圆移动

对于原点不在圆内的圆,设圆心为(x,y),其移动的代价为: ( r − x 2 + y 2 ) ∗ Π ∗ r 2 (r - \sqrt{x^2+y^2}) * Π * r^2 (rx2+y2 )Πr2

(让圆在圆心与原点的连线上移动为最优移动方案)

根据需要依次移除代价最小的圆即可。

#include<bits/stdc++.h>
using namespace std;const double pi = 3.14159265358979324;int main() {int n, k;cin >> n >> k;vector<double> tmp;double x, y, r;for(int i = 1; i <= n; i++){cin >> x >> y >> r;double len = x * x + y * y;if(len < r * r){	// 避免精度问题,比较时不开根号len = (r - sqrt(len)) * pi * r * r;tmp.push_back(len);}}sort(tmp.begin(), tmp.end());double res = 0;for(int i = 0; tmp.size() - i > k; i++) res += tmp[i];printf("%.10lf", res);return 0;
}

D. 小红的树上移动 (期望、DFS)

根据题意,小红只能由根向下走,不能走回头路,到叶子节点上停止。

即,树上每个分支都会对答案有贡献,每个分支的贡献为: 分支高度 ∗ ∏ ( 1 / x s o n ) , x ∈ 分支上结点 , x s o n 表示 x 的孩子数 分支高度 * \prod(1 / x_{son}),x \in 分支上结点, x_{son} 表示 x 的孩子数 分支高度(1/xson),x分支上结点,xson表示x的孩子数

#include<bits/stdc++.h>
#define ll long long
using namespace std;const ll mod = 1e9 + 7;
const int maxn = 1e5 + 5;vector<int> e[maxn];ll qpow(ll a, ll b){ll res = 1;while(b){if(b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}ll dfs(int f, int u, ll cnt, ll p){if(f != 0 && e[u].size() == 1) return cnt * qpow(p, mod-2) % mod;ll res = 0;for(auto v: e[u]){if(v == f || v == 0) continue; // 0 不参与计算res += dfs(u, v, cnt+1, p*(e[u].size()-1)%mod);res %= mod; }return res;
}int main() {int n;cin >> n;int x, y;for(int i = 2; i <= n; i++){cin >> x >> y;e[x].push_back(y);e[y].push_back(x);}e[1].push_back(0);	// 假设 1 的父亲为0ll res = dfs(0, 1, 1, 1);if(n == 1) res = 1;cout << res << endl;return 0;
}

E. F. 小红的中位数查询(主席树)

主席树板子题,求区间(l,r)的中位数,即求区间(l,r)的第 (r - l ) / 2 + 1大。即,主席树求第k大。

这个板子是我随便搜索,大家可自行学习。传送门

#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int n,m,a[N];
struct zxTree {int ls,rs,sum;//左右儿子,区间内元素个数
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define sum(x) tr[x].sum
} tr[N*40];//注意数组大小
int sz = 0;//不同版本的树的总数
int root[N];//root[i]存放第i棵树的树根的编号
int BuildTree(int l,int r) {/*建树,和普通线段树相同*/int rt = ++sz;sum(rt) = 0;if(l == r) return rt;int mid = l+r>>1;ls(rt) = BuildTree(l,mid);rs(rt) = BuildTree(mid+1,r);return rt;
}
int updata(int pre,int l,int r,int x) {/*新建一棵树,其比pre树多一个元素x*/int rt = ++sz;tr[rt] = tr[pre];sum(rt)++;if(l == r) return rt;int mid = l+r>>1;if(x <= mid) ls(rt) = updata(ls(pre),l,mid,x);else rs(rt) = updata(rs(pre),mid+1,r,x);return rt;
}
int ask(int pre,int rt,int l,int r,int k) {/*  依次是:上一个树根,当前树根,区间左右端点,所求区间第k大返回该区间第k大数的下标 */if(l >= r) return l;int res = sum(ls(rt)) - sum(ls(pre));int mid = l+r>>1;if(res >= k) return ask(ls(pre),ls(rt),l,mid,k);else return ask(rs(pre),rs(rt),mid+1,r,k-res);
}
int tmp[N];
int main() {scanf("%d%d",&n,&m);for(int i = 1; i <= n; i++) scanf("%d",a+i),tmp[i] = a[i];//离散化sort(tmp+1,tmp+1+n);int tot = unique(tmp+1,tmp+1+n)-tmp-1;root[0] = BuildTree(1,tot);for(int i = 1; i <= n; i++) {int x = lower_bound(tmp+1,tmp+1+tot,a[i])-tmp;root[i] = updata(root[i-1],1,tot,x);}//利用主席树可以加减原理计算for(int i = 1,l,r,k; i <= m; i++) {scanf("%d%d",&l,&r);k = (r - l + 1) / 2 + 1;int x = ask(root[l-1],root[r],1,tot,k);printf("%d\n", tmp[x]);}return 0;
}

G. 小红的数轴移动(二)(DP、逆推DP)

由于 x 可能由正负,下标整体偏移 10000。

d p ( i , M + j ) dp_{(i, M+j)} dp(i,M+j) 表示选择前 i 个物品,到达位置 j 需要的最小代价,其中 M 表示偏移量。

维护好dp数组后,判断是否需要全选,即是否走到了 x = 0。

  1. 如果没走到 x = 0 的位置,则任意顺序走即可。
  2. 如果走到 x = 0 的位置,则需要根据dp方程,逆推出转移顺序。
#include<bits/stdc++.h>
using namespace std;const int INF = 1e9;
const int maxn = 1e4 + 5;
const int M = 1e4;	// 偏移量 int a[105], dp[105][maxn*3];
vector<int> pos[105];int main() {memset(dp, 0x3f, sizeof(dp));	// 初始化一个较大值 
//	cout << dp[5][100];int n, x;cin >> n >> x;int sum = 0;set<int> s;for(int i = 1; i <= n; i++)	{cin >> a[i];s.insert(i);sum += a[i];pos[a[i]].push_back(i);}dp[0][M+x] = 0;	// dp[i][j] 表示前 i 个物品走到 j 需要的代价,注意这时候没有限制移动方向for(int i = 1; i <= n; i++){for(int j = -10000; j <= 10000; j++) dp[i][M+j] = dp[i-1][M+j]; // 不选当前a[i] for(int j = -10000; j <= 10000; j++){if(j + a[i] <= 10000){	// 超过这个范围就走不回来了 dp[i][M + j + a[i]] = min(dp[i][M + j + a[i]], dp[i-1][M + j] + a[i]);}if(j - a[i] >= -10000){dp[i][M + j - a[i]] = min(dp[i][M + j - a[i]], dp[i-1][M + j] + a[i]);}} }if(dp[n][M] == dp[0][0]){	// dp 的值等于初始值,表示没走到原点,即不会停,任意走就行 cout << sum << endl;for(int i = 1; i <= n; i++) cout << i << " ";cout << endl;}else{	// 可以走到原点,倒推DP cout << dp[n][M] << endl;vector<int> to_left, to_right; // 记录都是那些往左走了,那些往右走了int j = 0, val = dp[n][M];for(int i = n; i >= 1; i--){	// 从后往前倒推 if(dp[i-1][M+j] == dp[i][M+j]) continue; // 不选当前 a[i]if(j + a[i] <= 10000 && dp[i-1][M + j + a[i]] == dp[i][M + j] - a[i]){	// (i, M+j) 可以由 (i-1, m+j+a[i]) 得到 to_left.push_back(pos[a[i]].back()); // 从左往右走a[i]s.erase(pos[a[i]].back());	// 这个元素已经用过了pos[a[i]].pop_back();`// 相同值,可能有多个,选一个就行j += a[i];val -= a[i];}if(j - a[i] >= -10000 && dp[i-1][M + j - a[i]] == dp[i][M + j] - a[i]){	// (i, M+j) 可以由 (i-1, m+j-a[i]) 得到 to_right.push_back(pos[a[i]].back());	// 从右往左走a[i]s.erase(pos[a[i]].back());pos[a[i]].pop_back();j -= a[i];val -= a[i];}}vector<int> ans;while(x != 0){if(x < 0){	// 小于零就在 左往右走 中取一个x += a[to_right.back()];ans.push_back(to_right.back());to_right.pop_back();}else{x -= a[to_left.back()];ans.push_back(to_left.back());to_left.pop_back();}}for(auto item : ans) cout << item << " ";for(auto item : s) cout << item << " ";}return 0;
}

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

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

相关文章

Windows下Jenkins控制台中文乱码

问题描述 问题情况如下图&#xff1a; 环境信息 Windows 11 家庭中文版java 21.0.4 2024-07-16 LTSJenkins 2.452.3 解决方法 增加系统JAVA_TOOL_OPTIONS&#xff0c;并设置值为-Dfile.encodingGBK。 打开设置方法&#xff1a;桌面上右键点击“此电脑”图标&#xff0c;选…

mysql设置表的某一个字段每天定时清零

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

算法笔记(十三)——BFS 解决最短路问题

文章目录 迷宫中离入口最近的出口最小基因变化单词接龙为高尔夫比赛砍树 BFS 解决最短路问题 BFS(广度优先搜索) 是解决最短路径问题的一种常见算法。在这种情况下&#xff0c;我们通常使用BFS来查找从一个起始点到目标点的最短路径。 迷宫中离入口最近的出口 题目&#xff1a;…

Android SystemUI组件(11)SystemUIVisibility解读

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节思维导图&#xff0c;主要关注左侧最上方SystemUiVisibility解读部分即可。 本章节主要讲解SystemUiVisibility的概念及其相…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(一).创建基础表

一. 使用工具和命令 1.1 使用的工具 Navicat Premium 17 &#xff1a;“Navicat”是一套可创建多个连接的数据库管理工具。 MySQL版本8.0.39 。 1.2 使用的命令 Navicat中使用的命令 命令命令解释SHOW DATABASES&#xff1b;展示所有的数据库CREATE DATABASE 数据库名称; 创…

thinkphp 学习记录

1、PHP配置 &#xff08;点开链接后&#xff0c;往下拉&#xff0c;找到PHP8.2.2版本&#xff0c;下载的是ZIP格式&#xff0c;解压即用&#xff09; PHP For Windows: Binaries and sources Releases &#xff08;这里是下载地址&#xff09; 我解压的地址是&#xff1a;D:\…

1、如何查看电脑已经连接上的wifi的密码?

在电脑桌面右下角的如下位置&#xff1a;双击打开查看当前连接上的wifi的名字&#xff1a;ZTE-kfdGYX-5G 按一下键盘上的win R 键, 输入【cmd】 然后&#xff0c;按一下【回车】。 输入netsh wlan show profile ”wifi名称” keyclear : 输入完成后&#xff0c;按一下回车&…

Codeforces Round 316 (Div. 2) D题 Tree Requests(二分,dfs,在线,前缀异或)

题目链接 Codeforces Round 316 (Div. 2) D题 Tree Requests 思路 将 26 26 26个字母全部当作一个二进制数。 将每个深度的结点按照dfs序放到一个vector里&#xff0c;同时记录每个vector对应的前缀异或。 对于每一个询问x&#xff0c;只需在给定深度里找到 ≥ \ge ≥L[x]…

中断系统的原理

一、介绍 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的。中断是指‌CPU在正常运行程序时&#xff0c;由于内部或外部事件的发生&#xff0c;导致CPU中断当前运行的程序&#xff0c;转而去执行其他程序的过程。‌ 中断可以是硬件产生的&#xff0c;也可以是…

安全运营中心 (SOC) 团队对其安全工具感到失望

Vectra AI 表示&#xff0c;安全运营中心 (SOC) 从业人员认为&#xff0c;由于太多孤立的工具和缺乏准确的攻击信号&#xff0c;他们在检测和确定真实威胁的优先级方面正在失败。 人们对供应商的不信任感日益加深&#xff0c;认为供应商的工具在发现真正的攻击方面起的阻碍作用…

OpenCV视频I/O(16)视频写入类VideoWriter之获取当前使用的视频编解码器后端的名称函数getBackendName()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 getBackendName() 是一个成员函数&#xff0c;用于获取当前使用的视频编解码器后端的名称。这个函数可以帮助开发者了解正在使用的编解码器是什么…

金纳米星“融入”水凝胶,原位生长的奥秘,应用前景的探索

大家好&#xff01;今天来了解一项在三维水凝胶表面生长金纳米星的研究——《Growing Gold Nanostars on 3D Hydrogel Surfaces》发表于《Chemistry of Materials》。水凝胶在生物医学等诸多领域有着重要应用&#xff0c;而金纳米星具有独特的光学性质。这项研究通过原位合成的…

【Linux】线程与线程安全知识总结

向外张望的人在做梦&#xff0c; 向内审视的人才是清醒的。 --- 荣格 --- 我最近复习了线程安全这部分知识&#xff0c;将不明白的问题总结出来&#xff0c;并通过AI进行问答帮助我进行学习巩固。本人能力有限 &#xff0c;可能有些内容不准确&#xff0c;望各位大佬海涵&am…

Leetcode 3312. Sorted GCD Pair Queries

Leetcode 3312. Sorted GCD Pair Queries 1. 解题思路2. 代码实现 题目链接&#xff1a;3312. Sorted GCD Pair Queries 1. 解题思路 这一题的话坦率来说没有搞定&#xff0c;后来是找的大佬的代码抄了一下…… 整体来说这道题思路上还是比较暴力的&#xff0c;还是一个二重…

【前端开发入门】css快速入门

目录 引言一、css盒模型1. 盒模型概念2. 盒模型案例 二、css编写1. html文件内部编写1.1 标签style属性编写1.2 css选择器关联1.2.1 id选择器1.2.2 class选择器1.2.3 标签选择器1.2.4 css选择器作用域1.2.5 其他选择器1.2.6 各css选择器优先级 2. 单独维护css文件2.1 创建css文…

伙伴算法的概念

伙伴算法 (Buddy System) 是一种内存分配算法&#xff0c;用于动态分配和释放内存块。它通过将内存空间划分成大小为 2 的幂次的块&#xff0c;并采用特殊的合并策略来提高内存利用率和减少内存碎片。 核心思想: 伙伴算法的核心思想是将内存划分为大小为 2 k 2^k 2k 字节的块…

macOS .bash_profile配置文件优化记录

文章目录 说明原文件内容优化思路优化操作测试验证1. 验证JAVA_HOME2. 验证MAVEN_HOME3. 验证MONGODB_HOME4. 验证CLASSPATH5. 验证PATH 说明 展示的代码中&#xff0c;关于具体的文件路径位置&#xff0c;请灵活修改为自己的真实文件目录&#xff01; 原文件内容 从macOS C…

HDLBits中文版,标准参考答案 | 3.1.4 Karnaugh Map to Circuit | 卡诺图到电路

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 11 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 3 变量 2 4 变量 3 4 变量 4 4 变量 5 最小 SOP 和 POS 6 卡诺图 7 卡诺图 8 使用多路复用器实现的卡诺图 本文中的代码都能够正常运行&#xff0c;请放心食用&#x1f…

CSP-S复赛真题解析

2023年CSP-S复赛真题 密码锁 题意&#xff1a; 分析&#xff1a; 代码&#xff1a; 正解代码 #include<bits/stdc.h>using namespace std;int n; int va[10][10]; int vb[10]; int sum;int check() {for(int i1;i<n;i){vector<int > v;for(int j1;j<5;j…

最强AI绘画大模型Flux可以在SDWebUI 上使用了!超便捷的Flux模型使用教程!AI绘画零基础入门到实战教程

大家好&#xff0c;我是画画的小强 目前最强的AI绘画大模型Flux.1 横空出世有段时间了&#xff0c;模型效果也得到了广泛的认可&#xff0c;但是 Stable Diffusion WebUI 官方迟迟没有跟进&#xff0c;据说是因为要修改很多底层的处理机制&#xff0c;加之ComfyUI如火如荼&…