当前位置: 首页 > news >正文

2022CCPC绵阳站VP题解报告(CGHMAE六题)

文章目录

  • 2022CCPC绵阳站VP题解报告
    • 前言
    • [Problem - C ](https://codeforces.com/gym/104065/problem/C) (签到思维)
    • [H (codeforces.com)](https://codeforces.com/gym/104065/problem/H) (签到构造)
    • [Problem - G ](https://codeforces.com/gym/104065/problem/G) (签到思维)
    • [Problem - M](https://codeforces.com/gym/104065/problem/M) (栈)
    • [Problem - A ](https://codeforces.com/gym/104065/problem/A)(记忆化搜索)
    • [Problem - E ](https://codeforces.com/gym/104065/problem/E) (图论上的DP,根号分治优化)

2022CCPC绵阳站VP题解报告

前言

  • 队伍VP赛时 CGHME 五题,赛后A题。
  • 赛时个人出了CHE,赛后补3题GMA。
  • 题解按赛场过题人数排序。

Problem - C (签到思维)

注意到每次每个点的蝴蝶所在点的深度都会减少1,所以只需要在 1 号节点的所有孩子节点操作即可,答案就是1号节点的所有孩子的高度之和。

ac代码参考:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int N = 1e5 + 5, M = 2e5 + 5;int n, tot;
int head[N], ver[M], nxt[M], dep[N];inline void add(int x, int y){ver[++tot] = y; nxt[tot] = head[x]; head[x] = tot;
}void dfs(int x, int fa = 0){dep[x] = 1;for(int i = head[x]; i; i = nxt[i]){int y = ver[i];if(y == fa) continue;dfs(y, x);dep[x] = max(dep[x], dep[y] + 1);}
}void solve(){tot = 1;cin >> n;for(int i = 1; i < n; i++){int x, y;cin >> x >> y;add(x, y);add(y, x);}dfs(1);int ans = 0;for(int i = head[1]; i; i = nxt[i]){ans += dep[ver[i]];}cout << ans << '\n';
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);solve();return 0;
}

H (codeforces.com) (签到构造)

注意到 k ≤ 100 k \le 100 k100,所以我们完全可以铺开来,只考虑单元每轮死亡到少个不必考虑复活的事,所以延对角线输出 2 k 2k 2k 个点即可。

ac代码参考:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;void solve(){int k; cin >> k;cout << k * 2 << '\n';for(int i = 1; i <= 2 * k; i++){cout << i << ' ' << i << '\n';}
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);solve();return 0;
}

Problem - G (签到思维)

考虑相邻的两个数,其中较小的数一定无法存活至下一轮。因此每 一轮至少有一半(向下取整)的数字被删除,暴力模拟即可。

ac代码参考:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;void solve(){int n,x;cin>>n;vector<int> a;for(int i=1;i<=n;i++) cin>>x,a.push_back(x);vector<int> b;int ans=0;while(a.size()!=1){b.clear();for(int i=0;i<a.size();i++){if(i==0){if(a[i]>a[i+1]) b.push_back(a[i]);}else if(i==a.size()-1){if(a[i]>a[i-1]) b.push_back(a[i]);}else{if(a[i]>a[i+1]&&a[i]>a[i-1]) b.push_back(a[i]);}}a=b;ans++;}cout<<ans<<'\n';
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);solve();return 0;
}

Problem - M (栈)

注意到如果一段相同的字符 X X X 的左右两端点相邻 Y Y Y, 且 Y Y Y 能赢 X X X,则将这一段 X X X 全部换成 Y Y Y 不会影响答案。同理,如果 X X X 块位于序列的一端,且另一边与 Y Y Y 相邻。则也可以将这一段 X X X 全部换成 Y Y Y 不会影响答案。那么,我们就可以用一个栈来不断维护并更新 R P S RPS RPS 序列,时间复杂度 O ( ∣ s ∣ ) O(|s|) O(s)

ac代码参考:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;void solve(){string s;cin >> s;stack<char> st;st.push(s[0]);for(int i = 1; i < s.length(); i++){while(!st.empty()){char pre = st.top();if(s[i] == 'R')if(pre == 'P') break;else if(s[i] == 'P')if(pre == 'S') break;else if(s[i] == 'S')if(pre == 'R') break;st.pop();}st.push(s[i]);}while(st.size() > 1) st.pop();cout<< st.top() <<'\n';
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T;cin >> T;while(T--) solve();return 0;
}

Problem - A (记忆化搜索)

注意到选取或禁用英雄时,一定会选择己方和对方剩余英雄中价值最大的。当某方选到 k k k 个英雄后,它不会再做“选取英雄”操作,而是 尽可能地去做“禁用英雄”操作。所以双方轮流操作时能到达的”状态数”只有 O ( n k 2 ) O(nk^2 ) O(nk2)个。

我们用 d p ( x , i , j ) dp(x, i, j) dp(x,i,j) 表示当前双方总共操作 x x x 轮,分别已经选取了 i , j i, j i,j 个英雄时的答案。然后记忆化搜索即可。

ac代码参考:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int N = 2e5 + 5;int n, m, a[N], b[N], f[N][11][11];
bool vis[N][11][11];int dfs (int x, int ca, int cb) {if (x >= 2 * n) return 0;if (vis[x][ca][cb])   return f[x][ca][cb];vis[x][ca][cb] = true;int aa = x / 2 - cb + ca + 1, bb = (x + 1) / 2 - ca + cb + 1, &t = f[x][ca][cb];t = dfs (x + 1, ca, cb); //不选if (x % 2 == 0) { //Aif (aa <= n && ca < m)  t = max (t, dfs (x + 1, ca + 1, cb) + a[aa]);}   else { //Bif (bb <= n && cb < m)  t = min (t, dfs (x + 1, ca, cb + 1) - b[bb]);}return t;
}void solve(){cin >> n >> m;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) cin >> b[i];sort (a + 1, a + n + 1, greater<int>());sort (b + 1, b + n + 1, greater<int>());cout << dfs (0, 0, 0) << '\n';
}int main () {ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);solve();
}

Problem - E (图论上的DP,根号分治优化)

​ 对于这个问题,其实我们不必管 a i a_i ai,我们只要求出点权为 1 1 1 转移的最小代价最后乘以权值即可,这么转换后我们不难想到一个暴力的 D P DP DP 做法,令 f ( i , j ) f(i,j) f(i,j) 表示第 j j j 号点,在第 i i i 天后的所有操作中所需的最小代价。那么转移就明显了,第 i i i 天需要转移 b i b_i bi,那么 f ( i , b i ) = min ⁡ ( b i , y ) ∈ e d g e { w ( b i , y ) + f ( i + 1 , y ) } f(i,b_i) = \min_{(b_i,y)\in edge}\{w(b_i,y) + f(i + 1, y)\} f(i,bi)=min(bi,y)edge{w(bi,y)+f(i+1,y)} 其中 w ( x , y ) w(x,y) w(x,y) 为边权。

​ 但是,像上述 D P DP DP 解法,时间和空间上都会超出限制,我们考虑怎么优化。由于每一天我们只会更新某一个 j j j 的值,所以我们可以直接省略 f f f 的第一维。此外,状态的转移是图的邻域问题,我们可以考虑一个常用的套路:根号分治。我们选取一个阈值 B B B,对所有的点按度数的大小分为两类:

  • 对于度数小于 B B B 的点 j j j,我们只需要枚举来更新 f ( j ) f(j) f(j) 的的值。
  • 对于度数大于 B B B 的点 j j j,我们考虑维护一个 m u l t i s e t multiset multiset,对所有连向 j j j 的边 ( x , j ) (x,j) (x,j),将 f ( x ) + w ( x , j ) f(x) + w(x,j) f(x)+w(x,j) 放入集合。每次我们只需要从集合中取出最小值更新 f ( j ) f(j) f(j),再枚举所有连接的度数大于 B B B 的点,更新多重集即可。

对于度数小于 B B B 的点,我们转移的复杂度是 O ( B ) O(B) O(B) 的,对于度数大于 B B B 的点最多有 2 m B \frac{2m}{B} B2m 个,每次转移的复杂度是 O ( m B log ⁡ n ) O(\frac{m}{B}\log{n}) O(Bmlogn) 的。当 B = 2 m log ⁡ n B = \sqrt{2m\log n} B=2mlogn 时,总的复杂度为 O ( q m log ⁡ n ) O(q\sqrt{m\log n}) O(qmlogn )

ac代码参考:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int N = 1e5 + 5, M = 2e5 + 5;
const int mod = 998244353;int n, m, q, tot, tb;
ll a[N], b[N], f[N], deg[N], edge[M], eb[M];
int head[N], ver[M], nxt[M];
int hb[N], vb[M], nb[M];
multiset<ll> se[N];inline void add(int x, int y, ll z){ver[++tot] = y; edge[tot] = z;nxt[tot] = head[x]; head[x] = tot;
}
inline void addb(int x, int y, ll z){vb[++tb] = y; eb[tb] = z;nb[tb] = hb[x]; hb[x] = tb;
}void solve(){tot = tb = 1;cin >> n >> m >> q;int SQ = sqrt(2ll * m * log2(n));for(int i = 1; i <= n; i ++) cin >> a[i];for(int i = 1; i <= m; i++){int x, y, z;cin >> x >> y >> z;add(x, y, z); add(y, x, z);deg[x] ++; deg[y] ++;}for(int x = 1; x <= n; x++) if(deg[x] > SQ)for(int i = head[x]; i; i = nxt[i]){int y = ver[i], z = edge[i];se[x].insert(z + f[y]);if(deg[y] > SQ) addb(y, x, z);}for(int i = 1; i <= q; i ++) cin >> b[i];for(int j = q; j; j--){int x = b[j];if(deg[x] <= SQ){ll cost = 1e18;for(int i = head[x]; i; i = nxt[i])cost = min(cost, edge[i] + f[ver[i]]);for(int i = head[x]; i; i = nxt[i]){int y = ver[i], z = edge[i];if(deg[ver[i]] > SQ){se[y].erase(se[y].find(z + f[x]));se[y].insert(cost + z);}}f[x] = cost;}else {for(int i = hb[x]; i; i = nb[i])se[vb[i]].erase(se[vb[i]].find(f[x] + eb[i]));f[x] = *se[x].begin();for(int i = hb[x]; i; i = nb[i])se[vb[i]].insert(f[x] + eb[i]);}}ll ans = 0;for(int i = 1; i <= n; i++){ans = (ans + f[i] * a[i]) % mod;}cout << ans << '\n';
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);solve();return 0;
}

相关文章:

2022CCPC绵阳站VP题解报告(CGHMAE六题)

文章目录 2022CCPC绵阳站VP题解报告前言[Problem - C ](https://codeforces.com/gym/104065/problem/C) &#xff08;签到思维&#xff09;[H (codeforces.com)](https://codeforces.com/gym/104065/problem/H) &#xff08;签到构造&#xff09;[Problem - G ](https://codefo…...

代码随想录day23:贪心part1

455. 分发饼干 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int res 0;int index s.length - 1;for(int i g.length - 1; i > 0; i--){if(index > 0 && s[index] > g[i]){res;index--;}}return r…...

通过网页设置参数,submit还是json

在通过网页设置参数并发送到服务器时&#xff0c;选择使用submit&#xff08;通常是通过HTML表单的提交&#xff09;还是直接发送JSON数据&#xff08;通常是通过AJAX请求&#xff0c;如使用fetch API&#xff09;取决于几个因素&#xff0c;包括你的服务器端如何处理这些请求、…...

C语言 | Leetcode C语言题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; const int dx[4] {0, 1, 0, -1}; const int dy[4] {1, 0, -1, 0};int dfs(int x, int y, int** grid, int n, int m) {if (x < 0 || x > n || y < 0 || y > m || grid[x][y] 0) {return 1;}if (grid[x][y] 2) {return 0;}g…...

逼近理论及应用精解【12】

文章目录 卷积卷积层与滤波层定义数学原理与公式定理架构例子例题 卷积层和滤波层概念的详细解释卷积层滤波层 滤波层和卷积层在卷积神经网络&#xff08;CNN&#xff09;中区别滤波层卷积层总结卷积层的数学原理滤波层的数学原理 参考文献 卷积 卷积层与滤波层 定义 卷积层…...

LIN总线学习大全(基于CANoe和CAPL)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…...

国庆作业

day1 1.开发环境 Linux系统GCCFDBmakefilesqlite3 2.功能描述 项目功能: 服务器&#xff1a;处理客户端的请求&#xff0c;并将数据存入数据库中&#xff0c;客户端请求的数据从数据库进行获取&#xff0c;服务器转发给客户端。 用户客户端&#xff1a;实现账号的注册、登…...

Android OpenGLES2.0开发(四):矩阵变换和相机投影

事物的本质是事物本身所固有的、深藏于‌现象背后并决定或支配现象的方面‌。 还记得我们上一篇绘制的三角形吗&#xff0c;我们确实能够顺利用OpenGL ES绘制出图形了&#xff0c;这是一个好的开始&#xff0c;但这还远远不够。我们定义的坐标是正三角形&#xff0c;但是绘制出…...

快递查询软件:实现单号识别与批量物流查询的高效工具

随着网络购物的普及&#xff0c;快递物流行业迎来了前所未有的发展机遇&#xff0c;同时也面临着巨大的挑战。跟踪物流信息成为一个难题&#xff0c;因此&#xff0c;快递查询软件的核心功能之一便是单号识别。传统的快递单号输入方式繁琐且易出错在此背景下&#xff0c;快递查…...

nodejs与npm版本对应表

Node.js — Node.js 版本 (nodejs.org)...

Spring Boot 项目中如何使用异步任务

前置知识&#xff1a; 同步任务&#xff1a; 同步任务是在单线程中按顺序执行&#xff0c;每次只有一个任务在执行&#xff0c;不会引发线程安全和数据一致性等并发问题 同步任务需要等待任务执行完成后才能执行下一个任务&#xff0c;无法同时处理多个任务&#xff0c;响应慢…...

Scrum实战中遇到的问题与解决方法

在当今快速变化的技术环境中&#xff0c;IT企业面临着持续的市场压力和竞争&#xff0c;传统的瀑布式开发模式已经难以满足现代企业的需要。瀑布模型过于僵化&#xff0c;缺乏灵活性&#xff0c;导致项目经常延期&#xff0c;成本增加&#xff0c;最终可能无法达到预期效果。为…...

全面介绍 Windows 录屏工具:开启录制新篇章

高质量的录屏工具是我们录屏的得力助手。但是日常因为侧重点的不同&#xff0c;比如有的喜欢录制游戏画面、有的需要录制教学视频、演示操作也需要录屏工具。这次我们就来探讨一下windows录屏工具有哪些吧。 1.福晰录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 从这…...

Maven 和 NetBeans:集成与使用

Maven 和 NetBeans:集成与使用 Maven 和 NetBeans 是两款强大的工具,常用于Java开发。Maven是一个项目管理工具,它能够帮助管理项目的构建、报告和文档。NetBeans是一个集成开发环境(IDE),它为Java开发提供了丰富的功能和友好的用户界面。将Maven集成到NetBeans中,可以…...

【系统架构设计师】目录提纲

一、绪论&#xff08;TODO&#xff09; 二、计算机与网络基础知识&#xff08;TODO&#xff09; 三、信息系统基础知识&#xff08;TODO&#xff09; 四、系统开发基础知识&#xff08;TODO&#xff09; 五、软件架构设计&#xff08;TODO&#xff09; 六、UML建模与架构文…...

【微服务】—SpringBoot入门

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 文章目录 1 SpringBoot快速入门1.1 SpringBoot简介1.1.1 简介1.1.2…...

Linux: debug: perf: report: --sort

文章目录 简介实例简介 接上回:https://mzhan017.blog.csdn.net/article/details/142689870。 这里介绍perf的这个参数,还是非常的有用,尤其是分析对整个系统做perf record的数据,而不是单个进程做perf record。-s, --sort= : Sort histogram entries by given key(s) - …...

like 模糊查询的底层算法

like 模糊查询的底层算法 全文搜索算法、模糊查询、n-gram分隔算法功能介绍 百度搜索&#xff0c;文心一言给出的结果&#xff1a; SQL模糊查询底层通常使用全文搜索算法&#xff0c;如LIKE操作符和全文索引通常使用的n-gram分割算法。 n-gram是一种将文本分割成固定大小的词…...

【Linux实践】实验九:Shell流程控制语句

文章目录 实验九&#xff1a;Shell流程控制语句实验目的&#xff1a;实验内容&#xff1a;操作步骤&#xff1a;1. 复制*.c文件并排序2. 计算1-10的平方 实验九&#xff1a;Shell流程控制语句 实验目的&#xff1a; 掌握条件判断语句&#xff0c;如if语句、case语句。掌握循环…...

YOLOv8实战TT100K中国交通标志检测【数据集+YOLOv8模型+源码+PyQt5界面】

YOLOv8实战TT100k交通标志识别 文章目录 研究背景资源获取1.前言1.1 YOLO 系列&#xff1a;中国交通标志检测领域的璀璨明星1.2 Transformer与注意力机制&#xff1a;为中国交通标志检测注入新活力1.3 中国交通标志检测技术&#xff1a;迎接挑战&#xff0c;砥砺前行1.4 YOLOv8…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...