2023 China Collegiate Programming Contest (CCPC) Guilin (VP桂林 补题)

2023 China Collegiate Programming Contest (CCPC) Guilin (VP桂林 & 补题)

文章目录

  • 2023 China Collegiate Programming Contest (CCPC) Guilin (VP桂林 & 补题)
    • 写在前面
    • G. Hard Brackets Problem (签到题)
    • M. Flipping Cards (第二个签到题)
    • K. Randias Permutation Task (半个铜牌题)
    • I. Barkley II (铜牌题)
    • B. The Game (半个银牌题)
    • C. Master of Both IV (银牌题)
    • H. Sweet Sugar (金牌题)

写在前面

2023CCPC桂林的概况是:
3题快铜、5题银、7题金
9题捧杯、11题冠亚军
已更新GMKIH,待更新BC
签到题提供py,其余c++(很多卡时间有点死,py直接g)
签到题未提供思路,其余提供解题思路

G. Hard Brackets Problem (签到题)

Problem - G - Codeforces

按题意模拟,或后缀和判无解。

ac代码参考:

import sysinput = lambda: sys.stdin.readline().rstrip("\r\n")
out = sys.stdout.write
def S():return input()
def I():return int(input())
def print1(x):return out(str(x) + "\n")
# ----------------------------- # ----------------------------- #def solve():s = list(S())st, n = 0, len(s)i = 0while i < n and s[i] == ')': i += 1ans = s[:i]end,st = 0,0while i < n:if s[i] == '(':st += 1end += 1ans.append('(')else:if end:end -= 1st -= 1ans.append(')')else: ns.append(')')i += 1print1(''.join(ans) if st == 0 else "impossible")for _ in range(I()):solve()

M. Flipping Cards (第二个签到题)

Problem - M - Codeforces

ac代码参考

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+5;int n,tot;
int a[N],b[N];
int c[2*N];
int dp[N][2];bool check(int mid)
{int cnt=0;for(int i=1;i<=n;++i){if(a[i]>=mid)cnt++;}dp[0][0]=dp[0][1]=cnt;int maxx=cnt;for(int i=1;i<=n;++i){dp[i][0]=max(dp[i-1][0],dp[i-1][1]);	// 不选 i// 选 iif(b[i]>=mid&&a[i]<mid)dp[i][1]=max(dp[0][0]+1,dp[i-1][1]+1);else if(b[i]>=mid&&a[i]>=mid)dp[i][1]=max(dp[0][0],dp[i-1][1]);else if(b[i]<mid&&a[i]<mid)dp[i][1]=max(dp[0][0],dp[i-1][1]);else if(b[i]<mid&&a[i]>=mid)dp[i][1]=max(dp[0][0]-1,dp[i-1][1]-1);maxx=max({maxx,dp[i][0],dp[i][1]});}return maxx>=(n+1)/2;
}
void solve()
{cin>>n;for(int i=1;i<=n;++i){cin>>a[i]>>b[i];c[++tot]=a[i];c[++tot]=b[i];}sort(c+1,c+1+tot);tot=unique(c+1,c+1+tot)-c-1;int l=1,r=tot;int ans=-1;while(l<=r){int mid=(l+r)>>1;if(check(c[mid])){ans=c[mid];l=mid+1;}elser=mid-1;}cout<<ans<<'\n';
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);int T=1;while(T--)solve();return 0;
}

K. Randias Permutation Task (半个铜牌题)

Problem - K - Codeforces

注意到答案不超过 min ⁡ { 2 m , n ! } ≤ 362880 \min\{2^m, n!\} ≤ 362880 min{2m,n!}362880 (m个选或不选,),所以任何复杂度是 O ( a n s ) O(ans) O(ans) 级 别的爆搜都是正确的。具体来说,令 f i f_i fi 表示前 i i i 个排列能复合出的排列的集合,每次枚举下一 个排列选不选即可。

时间复杂度 Θ ( n m ⋅ min ⁡ ( 2 m , n ! ) ⋅ log ⁡ min ⁡ ( 2 m , n ! ) ) Θ(nm · \min(2^m, n!) · \log \min(2^m, n!)) Θ(nmmin(2m,n!)logmin(2m,n!))

ac代码参考

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 185;
int n, m, ans;
map<vector<int>, int>mp;void solve(){cin >> n >> m;vector<vector<int>>a(m+1, vector<int>(n+1));for (int i = 1; i <= m; i++) {     // m 个排列for (int j = 1; j <= n; j++) {cin >> a[i][j];}}vector<int> res(n + 1);for (int i = 1; i <= m; i++) {map<vector<int>, int> tmp;tmp = mp;tmp[a[i]] = 1;for (auto w : mp) {vector<int>p = w.first;for (int j = 1; j <= n; j++) {res[j] = p[a[i][j]];}tmp[res]=1;}mp = tmp;}cout << mp.size() << '\n';
}int main()
{ios::sync_with_stdio(false);cin.tie(0);solve();return 0;
}

I. Barkley II (铜牌题)

Problem - I - Codeforces

  • 给一个序列,选择一个区间使得区间颜色数 − 区间 m e x mex mex 最大,那么考虑是不是需要留一个比较小的不选,来使得答案最大?
  • 一个显然的暴力做法是枚举每一个算法种类,以此当间隔,再 O ( n ) O(n) O(n) 的计算该情况的答案,取 max ⁡ \max max。总的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  • 考虑怎么优化使其时间复杂度可以接受,使用树状数组扫描线统计颜色数即可(静态区间数颜色问题)。
  • 树状数组的知识点可以看这题学会:SDOI2009 HH的项链,总的时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

ac代码参考

#include<bits/stdc++.h>
#define endl '\n' 
using namespace std;const int N = 5e5+5;int a[N], su[N], vis[N];
int n, m;
vector<vector<int>> dic(N);struct Que{int l, r, mex;Que(int x, int y, int z) : l(x), r(y), mex(z){}
};
vector<Que> ask;void add(int pos, int x){while (pos <= n){su[pos] += x;pos += (-pos) & pos;}
}int query(int pos){int res = 0;while (pos){res += su[pos];pos -= (-pos) & pos;}return res;
}void solve(){ask.clear();cin >> n >> m;a[0] = 0;for(int i = 1; i <= n; i++) {cin >> a[i];if (a[i] <= n) dic[a[i]].push_back(i);}for (int i = 1; i <= n+1; i++){if (dic[i].size()){int pre = 1;for (auto r : dic[i]){if (r - 1 >= pre)ask.push_back(Que(pre, r - 1, i));pre = r + 1;}if (pre <= n)ask.push_back(Que(pre, n, i));} else {ask.push_back(Que(1, n, i));break;}}auto cmp = [&](Que x, Que y){return x.r < y.r;};sort(ask.begin(), ask.end(), cmp);for (int i = 1; i <= n; i++) vis[a[i]] = 0;for(int i = 1; i <= n; i++) dic[a[i]].clear();for (int i = 0; i <= n; i++) su[i] = 0;int nxt = 1, ans = -1e9;for(auto que : ask){for(int j = nxt; j <= que.r; j++){if (vis[a[j]]) add(vis[a[j]], -1);add(j, 1);vis[a[j]] = j;}nxt = que.r + 1;ans = max(ans, query(que.r) - query(que.l - 1) - que.mex);}cout << ans << endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(0);int T;cin >> T;while (T--)solve();return 0;
}

B. The Game (半个银牌题)

Problem - B - Codeforces

C. Master of Both IV (银牌题)

Problem - C - Codeforces

H. Sweet Sugar (金牌题)

Problem - H - Codeforces

题面可被翻译为:给定一棵无根树,每个点的点权为 0 0 0 1 1 1 2 2 2,从树上找到尽量多的不重叠的连通块,使得每个连通块的点权和都为 k k k

任选点权和为 k k k 的连通块,其中 k > 2 k > 2 k>2,那么该连通块至少包含两个点权非零的叶子,否则可以在不改变 k k k 的前提下迭代删去点权为 0 0 0 的叶子。

  • 如果至少有一个叶子的点权为 2 2 2,那么删去该叶子即可得到点权和 为 k − 2 k − 2 k2 的连通块。
  • 否则所有叶子的点权都为 1 1 1,那么同时删去两个叶子即可得到点权 和为 k − 2 k − 2 k2 的连通块。

因此可以通过树形 DP 求出总和为奇数 / / /偶数的点权和最大的连通块来 O ( 1 ) O(1) O(1) 判断是否存在点权和为 k k k 的连通块。

任选一点为根,自底向上贪心。 假设当前考虑完了 x x x 的所有儿子,如果 x x x 子树目前与 x x x 相连的部分存在 一个点权和为 k k k 的连通块,那么切掉 x x x x x x 父亲之间的边不会使得答案变差,对答案的贡献为 1 1 1。 时间复杂度 O ( n ) O(n) O(n)

ac代码参考

#include <bits/stdc++.h>using namespace std;const int INF = 1e9, N = 1e6+5;
int head[N], ver[N+N], nxt[N+N];
int c[N];
int n, k, tot;array<int, 3> dfs(int x, int p) {array<int, 3> res = {c[x], 0, INF};for (int i = head[x]; i; i = nxt[i]) {int y = ver[i];if (y == p) continue;auto [su, ans, caneat] = dfs(y, x);res[0] += su;     // 子树总点权res[1] += ans;    // 树形DP整合子树答案res[2] = min(res[2], caneat);}if (res[0] & 1)res[2] = min(res[2], res[0]);if (res[0] >= k) // 判断是否存在点权和为 k 的连通块,res[0] - res[2] 用于改变子树点权的奇偶if ((res[0] & 1) == (k & 1) || res[0] - res[2] >= k) {return {0, res[1] + 1, INF};}return res;
}void solve() {tot = 0;auto add = [](int x,int y){ver[++tot] = y, nxt[tot] = head[x], head[x] = tot;};cin >> n >> k;for(int i = 0; i <= n; i++) head[i] = 0;for (int i = 1; i <= n; i++) {cin >> c[i];}for (int i = 0; i < n - 1; i++) {int x, y;cin >> x >> y;add(x,y);add(y,x);}auto [_, ans, __] = dfs(1, 1);  // x, parentcout << ans << '\n';
}int main() {ios::sync_with_stdio(false);cin.tie(0);int T;cin >> T;while (T--) {solve();}
}

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

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

相关文章

java项目总结4

目录 1.正则表达式 2.爬虫 3.时间 4.包装类 5.工具类之Arrays 6.Lambda 1.正则表达式 用于验证字符串是否满足自己所需要的规则。方法&#xff1a;matches 注意&#xff1a;\在Java中有特殊涵义&#xff0c;是将其它的意思本来化&#xff0c;假设"是用来引…

【python基础】—入门函数print()的参数解析及使用场景

文章目录 一、print()函数二、区隔符—sep三、结束符号—end四、内容写入文件—file五、缓冲输出设置—flush 一、print()函数 功能 print()函数就是把一个或多个对象转换为其文本表达式形式&#xff0c;然后发送给标准输出流或者类似的文件流。 语法 print(value, …, sep’ …

逆向分析之电脑端如何调试一些只能手机端浏览器才可以打开的网站

手机端浏览器的指纹和电脑端浏览器的指纹是不同的,这样只在手机端浏览器运行的网站则可以检测网站是否满足手机端浏览器指纹的要求,不满足则可以进行一些反爬措施。 例如一些公众号,其实就是使用手机端浏览器打开的H5网站,就可以进行手机端浏览器指纹检测。 这里只是讲解下…

「AI绘画Stable Diffusion 零基础入门必看」ControlNet控制网:轻松控制你的AI绘画出图效果详解

大家好&#xff0c;我是灵魂画师向阳 前言 AI绘画Stable Diffusion 在 ControlNet 出现之前&#xff0c;基于扩散模型的 AI 绘画是极难控制的&#xff0c;因为扩散的过程充满了随机性。 如果只是纯粹自娱自乐&#xff0c;这种随机性并不会带来多大困扰&#xff1b;但在产业化…

安全身份和访问管理:云服务器的守护者

安全身份和访问管理&#xff1a;云服务器的守护者 在云计算时代&#xff0c;身份和访问管理&#xff08;Identity and Access Management, IAM&#xff09;是确保云服务器安全的关键组成部分。IAM涉及到控制谁可以访问云资源、他们可以执行什么操作以及如何确保这些访问是安全…

如何高效学习(一)

什么是学习&#xff1f;学习的本质是什么&#xff1f;如何学习&#xff1f;如何更加高效的学习 以下内容均为观看B站UP主(硬核学长2077)所做总结和自我分析 一、自我介绍 ​ 我&#xff0c;一个二三线城市小小程序员&#xff0c;在高中学习就很一般&#xff0c;但当时并没有特…

《框架封装 · Redis 事件监听》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

Object方法重写

这篇文章大家随意看看就好&#xff0c;只是一点理解的东西&#xff0c;当然你也可以认真调查。 我们需要知道Obecj是java中的一个类&#xff0c;是所有类的父类&#xff0c;即超类。对&#xff0c;超级赛亚人的那个超。 我们需要关注其中的equals、tostring这两个方法。 例如&…

电脑管理软件是什么?电脑管理软件能做什么?

电脑管理软件是一种专门设计用于管理和优化计算机系统的软件工具。它涵盖了多个方面&#xff0c;从系统维护、资源分配到安全防护&#xff0c;都有着广泛的应用。以下是对电脑管理软件及其功能的详细解析&#xff1a; 一、电脑管理软件的定义 电脑管理软件是一种管理类型的软…

stm32毫秒ms延时,HAL_Delay()

STM32的HAL库确实提供了毫秒级的延时函数&#xff0c;即HAL_Delay()函数。这个函数使用SysTick定时器来实现延时&#xff0c;并且可以配置为微秒级的延时。 //stm32l4xx_hal.c /*** brief This function provides minimum delay (in milliseconds) based* on variable i…

自动化发布:Conda包依赖的持续集成之旅

自动化发布&#xff1a;Conda包依赖的持续集成之旅 引言 在现代软件开发中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;是提高开发效率和软件质量的关键实践。Conda作为Python和其他科学计算语言的包管理器&#xff0c;支持通过自动化流程发布包依赖。本文将…

现在一个表有自增字段id,姓名,年龄,手机号等等数据,什么场景下可以用到Supplier,Function,Consumer,Predicate等函数式接口

在处理具有自增字段id&#xff0c;姓名&#xff0c;年龄&#xff0c;手机号等字段的数据表时&#xff0c;Supplier、Function、Consumer和Predicate等函数式接口可以应用于多种场景。下面是一些具体的应用场景和示例&#xff1a; Supplier Supplier<T>接口用于生成或提…

宿州降本 提质 增效 数据采集监控平台提高生产自动化水平

在当今竞争激烈的市场环境中&#xff0c;企业追求降本、提质、增效已成为发展的关键。而我们的[数据采集监控平台名称]数据采集监控平台&#xff0c;正是助力企业实现这一目标的强大工具。 LP-SCADA数据采集监控平台是工业4.0中主要的数据采集系统之一&#xff0c;主要针对产线…

SimLab 流体网格建模工具详解 Part2: Mesh

SimLab的建模功能 SimLab中和流体网格建模相关的功能主要集成在 Geometry 和 Mesh 两个标签中。在上期文章中&#xff0c;我们详细介绍了Geometry标签中的内容&#xff0c;本期文章我们将分享继续分享 Mesh 标签的内容&#xff0c;一起来看看吧。 Mesh 标签 标签下的工具生成网…

C++八股(一)

一、new和malloc ⭐ new是C++的关键字,用于动态分配内存并创建对象。它可以根据类型自动计算所需内存空间,并调用对象的构造函数进行初始化。在使用new分配内存后,需要使用delete来释放这些内存空间,以防止内存泄漏。malloc是C语言的库函数,用于动态分配一块指定大小的内存…

南方CASS:测绘工作者的得力助手

初识南方CASS 南方CASS&#xff0c;这款软件在我的工作和生活中扮演了不可或缺的角色。作为一名长期的使用者&#xff0c;我深感它的功能之强大与便捷。今天&#xff0c;我愿以季羡林先生的口吻&#xff0c;带大家走进南方CASS的世界&#xff0c;分享我与它的点滴故事。 功能…

不同编程环境中GPU调用代码

在编程中&#xff0c;调用 集成显卡&#xff08;集显&#xff09; 和 独立显卡&#xff08;独显&#xff09; 通常涉及设置GPU设备和执行计算任务。以下是一些示例代码&#xff0c;展示了如何在不同编程环境中使用 集显 和 独显 。 文章目录 1. 使用CUDA和PyTorch调用GPU检查可…

天线介绍简略

天线在无线通信中是必不可少的组件&#xff0c;作为基础部分为无线通信所需&#xff0c;天线的形式从方向上有全向和定向&#xff0c;从实现上有微带、对称振子、阵列天线等&#xff0c;极化上有垂直极化、水平极化、圆极化等&#xff0c;天线的指标有增益、驻波、带宽等&#…

股票软件中的L2行情是什么意思?什么是level2行情以及如何获取level2行情

行情接入方法 level2行情websocket接入方法-CSDN博客 level2行情是什么意思&#xff1f; L2行情&#xff0c;即Level 2行情&#xff0c;是股票市场中一个不可或缺的高级术语&#xff0c;它代表着比基础Level 1行情更为详尽的市场洞察力。Level 2行情解锁了市场深度的新维度&…

大模型推理:vllm多机多卡分布式本地部署

文章目录 1、vLLM分布式部署docker镜像构建通信环境配置 2、其他大模型部署工具3、问题记录参考文献 单台机器GPU资源不足以执行推理任务时&#xff0c;一个方法是模型蒸馏量化&#xff0c;结果就是会牺牲些效果。另一种方式是采用多台机器多个GPU进行推理&#xff0c;资源不足…