VP AtCoder Beginner Contest 380

news/2025/1/20 22:04:18/文章来源:https://www.cnblogs.com/maburb/p/18682581

A - 123233

模拟即可。

点击查看代码
void solve() {int cnt[10]{};int n;std::cin >> n;while (n) {++ cnt[n % 10];n /= 10;}for (int i = 1; i <= 3; ++ i) {if (cnt[i] != i) {std::cout << "No\n";return;}}std::cout << "Yes\n";
}

B - Hurdle Parsing

题意:给你一个字符串,用'|',分割了一些'-',问每一段'-'的个数是多少。

模拟。

点击查看代码
void solve() {std::string s;std::cin >> s;for (int i = 0; i + 1< s.size(); ++ i) {int j = i + 1;while (j < s.size() && s[j] == '-') {++ j;}std::cout << j - i - 1 << " ";i = j - 1;}std::cout << "\n";
}

C - Move Segment

题意:给你一个\(01\)串,把第\(k\)\(1\)的连通块移到前面\(1\)的后面。

模拟。

点击查看代码
void solve() {int n, k;std::cin >> n >> k;std::string s;std::cin >> s;int cnt = s[0] == '1', last = -1;for (int i = 0; i < n; ++ i) {if (s[i] == '0' && s[i + 1] == '1') {++ cnt;if (cnt == k) {int j = i + 1;++ last;while (j < n && s[j] == '1') {std::swap(s[j], s[last]);++ j, ++ last;}break;}}if (s[i] == '1') {last = i;}}std::cout << s << "\n";
}

D - Strange Mirroring

题意:对于一个字符串,每次把它大小写改变然后接到后面,重复\(10^{100}\)次,\(q\)次询问,每次问第\(k\)个字符。

模拟单个字符发现,每次长度是成倍数增长,第\(n + 2^in\)个地方一定是取反的,因为这个地方就是第一个字符变过来的,这提示我们找到\(k\)在的块,然后就变成了一个子问题,看要找多少次记录取反次数就行。

点击查看代码
void solve() {std::string s;std::cin >> s;int n = s.size();int q;std::cin >> q;while (q -- ) {i64 x;std::cin >> x;int cnt = 0;while (x > n) {i64 k = 1;while ((__int128)k * n < x) {k *= 2;}x -= (__int128)k * n / 2;++ cnt;}char c = s[x - 1];if (cnt & 1) {c = c >= 'a' ? c - 32 : c + 32;}std::cout << c << " \n"[!q];}
}

E - 1D Bucket Tool

题意:\(n\)个格子每个格子的颜色为\(i\),有两种操作:

  1. \(x\)和所有与他相邻并且颜色相同的格子颜色都变成\(y\)
  2. 询问颜色为\(x\)的有多少个格子。

容易想到用并查集维护颜色相同的块,那么当改变一个格子颜色时,判断是不是要和这个块最左边位置减一的位置是不是同一个颜色,和这个块最右边位置加一的位置是不是同一个颜色。那么我们需要用并查集记录一个集合的颜色,个数,最左边位置和最右边位置。

点击查看代码
struct DSU {std::vector<int> fa, cnt;DSU(int _n) {fa.assign(_n + 1, 0);cnt.assign(_n + 1, 1);std::iota(fa.begin(), fa.end(), 0);}int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}void merge(int x, int y) {x = find(x), y = find(y);if (x == y) {return;}fa[y] = x;cnt[x] += cnt[y];cnt[y] = 0;}int same(int x, int y) {return find(x) == find(y);}int size(int x) {return cnt[find(x)];}
};void solve() {int n, q;std::cin >> n >> q;DSU ds(n);std::vector<int> id(n + 1), min(n + 1), max(n + 1), cnt(n + 1, 1);std::iota(id.begin(), id.end(), 0);std::iota(min.begin(), min.end(), 0);std::iota(max.begin(), max.end(), 0);while (q -- ) {int op;std::cin >> op;if (op == 1) {int x, y;std::cin >> x >> y;if (id[ds.find(x)] != y) {cnt[y] += ds.size(x);cnt[id[ds.find(x)]] -= ds.size(x);id[ds.find(x)] = y;int l = min[ds.find(x)] - 1, r = max[ds.find(x)] + 1;if (l && id[ds.find(l)] == y) {min[ds.find(x)] = min[ds.find(l)];ds.merge(x, l);}if (r <= n && id[ds.find(r)] == y) {max[ds.find(x)] = max[ds.find(r)];ds.merge(x, r);}}} else {int x;std::cin >> x;std::cout << cnt[x] << "\n";}}
}

F - Exchange Game

题意:有两个人,第一个人有\(n\)张牌,第二个人有\(m\)张牌,桌子上还有\(k\)张牌。两个人轮流出牌,如果桌子上有一张牌小于当前这个人出的牌,那么当前这个人可以拿走这张牌。问第一个人能不能赢。

注意到\(n+m+k<=12\),想到爆搜,定义\(dfs(u, x, y), (u \in \{0, 1\})\)为出牌人为\(u\)第一个拥有牌的状态为\(x\),第二个为\(y\),这里的\(x,y\)都是二进制数,利用状压表示有没有某一张牌。那么每次枚举当前这个人出哪张牌和是否拿走某张牌。和\(sg\)函数一样,不能走为必败态,如果当前状态能走到一个必败态则是必胜态,否则时必败态。

点击查看代码
const int N = 1 << 12;int f[2][N][N];
int a[12];
int n, m, k;int dfs(int u, int x, int y) {if (f[u][x][y] != -1) {return f[u][x][y];}int c = ~(x | y);int res = 0;if (u == 0) {for (int i = 0; i < n + m + k; ++ i) {if (x >> i & 1) {res |= !dfs(u ^ 1, x - (1 << i), y);for (int j = 0; j < n + m + k; ++ j) {if ((c >> j & 1) && a[j] < a[i]) {res |= !dfs(u ^ 1, x - (1 << i) + (1 << j), y);}}}}} else {for (int i = 0; i < n + m + k; ++ i) {if (y >> i & 1) {res |= !dfs(u ^ 1, x, y - (1 << i));for (int j = 0; j < n + m + k; ++ j) {if ((c >> j & 1) && a[j] < a[i]) {res |= !dfs(u ^ 1, x, y - (1 << i) + (1 << j));}}}}}f[u][x][y] = res;return res;
}

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

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

相关文章

ssm日记01

大前天 即2025.1.15-17学习了spring的前后台联合案例 就是springmvc的ssm整合包括异常处理的方法跟着敲了一边代码,不知道之后会不会使用或者说自己敲一遍,或许到自己跟着视频写案例才会使用到,或者说自己写一个小项目的时候才会用到 写这个异常处理受益匪浅,知道了从系统异…

ssm日记

前天即1.18号学习了springmvc的拦截器知识 但是好像用的不多 拦截器是相对于过滤器 是在请求进入web容器之后拦截和审核的其中主要是实现一个接口的三个方法分别是preHandle postHandle afterCompletion有相关执行顺序 这是代码和注释

学习ssm日记

补发一下前几次的学习日记 这是前两天在学maven高级的代码 都是自己敲得跟着视频 学习了分模块开发和父工程的创建以及关于依赖和pom文件相关知识

OpenWRT配置旁路由/中继模式,同时配置作为NAS必备的IPv6公网IP

1. 环境和要达成的目标 1.1 目标 主路由已配置好拨号,DHCP,IPv6 已刷OpenWRT路由B70作为中继路由,提高覆盖,解决一些老旧只能设备接入问题。 OpenWRT路由同时插入移动硬盘,配置WebDAV和smba作为NAS使用,所以此路自身要能获取到IPv6地址。 我的OpenWRT路由是极路由4,刷的…

【网关系统】通用设计

本文准备围绕七个点来讲网关,分别是网关的基本概念、网关设计思路、网关设计重点、流量网关、业务网关、常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分。 一、什么是网关 网关,很多地方将网关比如成门, 没什么问题, 但是需要区分网关与网桥的区别,…

一文告诉你Linux下如何用C语言实现ini配置文件的解析和保存

嵌入式项目开发中,会有很多功能模块需要频繁修改参数,Linux下我们可以通过ini格式的文件保存配置信息。 本文通过开源库iniparser,详细讲解如何用C语言实现ini文件的参数解析和配置保存。 本文代码实例获取方式见文末。 一、ini文件 1 什么是 ini文件INI(Initialization F…

Mysql的学习

Mysql建立 索引优化: sql优化: 为了解决下面的索引失效问题序列索引优化:

中考英语优秀范文-014 The hero in my heart 我心中的英雄

1 写作要求 自古以来,人们对英雄的定义没有统一的标准。英雄可以是科学家、军人、运动员,也可以是医生、保安或外卖骑手。假如你是学校广播站的一名英语播报员,明天你准备向大家介绍一位你心目中的英雄,请你根据下面的要点提示,写一篇英语广播稿。 1 须包含提示中的所有内…

python 探空数据根据时间偏移量计算具体时间

这里有一组探空数据,每天08时和20时放气球,气球飞上去的时间就是用时间偏移量来计算的,而不是直接显示好的 根据“年”“月”“日”“时”“时间偏移量”列,时间偏移量单位为秒,计算具体的时间 #!/usr/bin/python3 # -*- coding: utf-8 -*- """ @Time : 20…

LaTeX之符号表

本文介绍了在 $\LaTeX{}$ 中常用的符号。\(\LaTeX{}\) 之符号表 目录\(\LaTeX{}\) 之符号表\(\LaTeX{}\) 普通符号文本/数学模式通用符号希腊字母二元关系符二元运算符巨算符数学重音符号箭头作为重音的箭头符号定界符用于行间公式的大定界符其他符号AMS 符号AMS希腊字符和希伯…

【抓包工具】wireshark零基础使用教程

Wireshark是什么 Wireshark是使用最广泛的一款「开源抓包软件」,常用来检测网络问题、攻击溯源、或者分析底层通信机制。 它使用WinPCAP作为接口,直接与网卡进行数据报文交换。 Wireshark抓包原理 Wireshark使用的环境大致分为两种,一种是电脑直连互联网的单机环境,另外一种…