VP AtCoder Beginner Contest 381

news/2025/1/19 17:21:02/文章来源:https://www.cnblogs.com/maburb/p/18679729

A - 11/22 String

题意:定义\(11/22\)串是前面都是\(1\)后面都是\(2\)\(1,2\)的个数相同,中间是一个'/'。 判断给你的字符串是不是\(11/22\)串。

模拟即可。

点击查看代码
void solve() {int n;std::cin >> n;std::string s;std::cin >> s;if (n % 2 == 0 || s.substr(0, n / 2) != std::string(n / 2, '1') || s.substr(n / 2 + 1) != std::string(n / 2, '2') || s[n / 2] != '/') {std::cout << "No\n";} else {std::cout << "Yes\n";}
}

B - 1122 String

题意:定义\(1122\)串为每个奇数位置\(i\),都有\(a_i = a_{i+1}\),并且每个数只能恰好出现两次。判断是不是\(1122\)串。

一样模拟。

点击查看代码
void solve() {std::string s;std::cin >> s;int n = s.size();if (n & 1) {std::cout << "No\n";return;}std::vector<int> cnt(26);for (int i = 0; i < n; i += 2) {if (s[i] != s[i + 1]) {std::cout << "No\n";return;}if (cnt[s[i] - 'a']) {std::cout << "No\n";return;}cnt[s[i] - 'a'] = 1;}std::cout << "Yes\n";
}

C - 11/22 Substring

题意:和\(A\)题一样,不过要你判断字符串是\(11/22\)串的最长子串的长度。

在每个'/'处两边扩展记录最长长度即可。

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

D - 1122 Substring

题意:和\(B\)题一样,不过要你判断字符串是\(1122\)串的最长子串的长度。

记录每个数出现的次数,分奇数起点和偶数起点分别双指针模拟即可。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::vector<int> st(n + 1);int ans = 0;for (int i = 0, j = 0; i + 1 < n;) {j = std::max(i, j);while (j + 1 < n && a[j] == a[j + 1] && st[a[j]] == 0) {st[a[j]] = 1;j += 2;}ans = std::max(ans, j - i);st[a[i]] = 0;i += 2;}for (int i = 1, j = 1; i + 1 < n;) {j = std::max(i, j);while (j + 1 < n && a[j] == a[j + 1] && st[a[j]] == 0) {st[a[j]] = 1;j += 2;}ans = std::max(ans, j - i);st[a[i]] = 0;i += 2;}std::cout << ans << "\n";
}

E - 11/22 Subsequence

题意:和\(A\)一样,不过有\(Q\)次询问,每次问你\([L, R]\)区间内\(11/22\)最长子序列是多少。

把所有'/'的位置存下来,然后记录\(1\)\(2\)的前缀和。那么每次找到第一个位置大于等于\(L\)的'/'和最后一个小于等于\(R\)的'/',那么可以二分,如果当前'/'两边\(1\)的个数大于等于\(2\)的个数我们就应该往左边走,否则往右边走。因为这个二分出来的不一定是最优解,所以我们需要在二分过程中记录答案。

点击查看代码
void solve() {int n, q;std::cin >> n >> q;std::string s;std::cin >> s;std::vector<int> sum1(n + 1), sum2(n + 1);std::vector<int> a;for (int i = 0; i < n; ++ i) {sum1[i + 1] = sum1[i] + (s[i] == '1');sum2[i + 1] = sum2[i] + (s[i] == '2');if (s[i] == '/') {a.push_back(i + 1);}}while (q -- ) {int l, r;std::cin >> l >> r;int L = std::lower_bound(a.begin(), a.end(), l) - a.begin();int R = std::upper_bound(a.begin(), a.end(), r) - a.begin() - 1;if (L > R) {std::cout << 0 << "\n";continue;}int ans = 0;while (L <= R) {int mid = L + R >> 1;int one = sum1[a[mid]] - sum1[l - 1], two = sum2[r] - sum2[a[mid]];ans = std::max(ans, std::min(one, two));if (one >= two) {R = mid - 1;} else {L = mid + 1;}}std::cout << ans * 2 + 1 << "\n";}
}

F - 1122 Subsequence

题意:跟\(B\)题一样,不过要你求最长的\(1122\)子序列。

注意值域只有\(20\),我们可以状压。记录满足\(f_i\)这个状态用到的数的最后位置。用\(suf_{i,j}\)记录第\(i\)个位置后面\(j\)出现的最早位置。那么如果\(suf_{f_i,j}\)\(suf_{suf_{f_i,j},j}\)都存在,那么\(f_i\)可以转移到\(f_{i|(1<<j)}\)

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n);std::vector suf(n + 1, std::array<int, 20>{});for (int i = 0; i < n; ++ i) {std::cin >> a[i];-- a[i];}for (int i = n - 1; i >= 0; -- i) {suf[i] = suf[i + 1];suf[i][a[i]] = i + 1;}std::vector<int> f(1 << 20, n + 1);f[0] = 0;for (int i = 0; i < 1 << 20; ++ i) {if (f[i] > n) {continue;}for (int j = 0; j < 20; ++ j) {if ((~i >> j & 1) && suf[f[i]][j] != 0 && suf[suf[f[i]][j]][j] != 0) {f[i | (1 << j)] = std::min(f[i | (1 << j)], suf[suf[f[i]][j]][j]);}}}int ans = 0;for (int i = 0; i < 1 << 20; ++ i) {if (f[i] <= n) {ans = std::max(ans, __builtin_popcount(i));}}std::cout << ans * 2 << "\n";
}

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

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

相关文章

Go 反射 の 应用场景

两年前曾经写过一篇博客,是关于反射基本概念的 Go 反射 の 基本概念,之后对其再也没有更深入的学习,主要因为 反射主要应用在一些基本库中,而在平时的项目开发中几乎用不到。本文结合一个sql构造器的应用案例,深入的了解一下反射的应用场景。 什么是反射射就是程序在运行时…

中考英语优秀范文-热点话题-传统文化-010 Mid-Autumn Festival 中秋节

1 写作要求 中秋节是我国的传统节日,随着经济的发展和时代的变迁,中秋节依然在我们国人心中有着重要的位置。在中秋节,人们望着天上的明月,守望膜拜,吃着月饼,寄托情怀,这个节日更多地被赋予了思念亲人的色彩,祈求团圆和幸福。过去的中秋节有没有特别让你难忘的事情发生…

AtCoder Beginner Contest 389

A - 9x9 题意一位数的乘法思路模拟代码点击查看代码 #include <bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> pii;const int mxn = 1e6 + 5;void solve() {string s;cin >> s;cout << (s[0] - 0) * (s[2] - 0) …

2025 开局,我的身体给我上了一课

2025年,我被身体狠狠地上了一课!最终不得不放弃?这不仅是一个关于放弃的故事,更是一个关于接受和改变的过程背景 说实话,时间这东西真的太快了,一年就过去了。 每到这个时候,大家都会写年终总结:这一年,做了什么?也许是因为找不到清晰的答案,干脆就摆烂,都懒得写了…

VS Code远程连接服务器

VS Code远程连接服务器 总体分为两步:在远程服务器安装SSH协议实现软件OpenSSH 在VS Code安装Remote-SSH插件,然后利用该插件登录远程服务器在远程服务器安装SSH协议实现软件 查看是否安装了SSH协议实现软件 dpkg -l | grep ssh如果没有安装,可以通过以下命令安装OpenSSH的客…

Prim最小生成树算法

Prim最小生成树算法 首先给出最小生成树的概念:把给定的无向图中转换成一棵树,且树的边权和最小 Prim算法基于贪心的思想,每次在图中选取距离最小生成树最近的点加入树 首先给出朴素的模板算法: struct edge{int v,w; };int n,m; vector<edge> e[5010]; int dis[5010…

同余前缀和

1 #include<iostream>2 using namespace std;3 4 /*5 原题地址:https://www.luogu.com.cn/problem/P31316 农夫约翰的 \( N \) 头奶牛站在一排,就像它们时不时做的那样。每头奶牛都有一个唯一的整数ID号,7 这样农夫约翰可以区分它们。农夫约翰想要给一组连…

1.MySql基础架构之SQL语句的执行

1.MySQL数据库的整体架构(i)连接器:连接器负责与客户端建立连接,获取权限、维持和管理连接。连接命令中的mysql是客户端工具,用来建立服务端连接。在完成经典的TCP握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。 ​ 如果用户名密码认证通过…

ATF引导启动流程整理-Part2:BL1引导启动流程整理

接上一章的介绍,本文详细整理一下 BL1 阶段的流程 Ch3: ATF启动流程 上面一章简单的介绍了 ATF的隔离和划分,下面就介绍一下使用 ATF 初始启动的流程。ARM v8的启动流程包含多个阶段,典型的官方定义的标志阶段包括 BL1、BL2、BL31、BL32、BL33,根据不同需求这些阶段可以添加…

推荐一款非常好用的在线 SSH 管理工具

前言 SSH工具在远程连接、文件传输、远程管理和增强安全性等方面发挥着重要作用,是我们开发人员和系统管理员不可或缺的工具。今天大姚给大家推荐一款非常好用的在线 SSH 管理工具:Xterminal。工具介绍 Xterminal一个好用的在线SSH、SFTP工具,支持跨平台(Windows、Linux、M…

代码随想录——动态规划背包问题总结

https://www.programmercarl.com/背包总结篇.html#听说背包问题很难-这篇总结篇来拯救你了

DASCTF --wp--web

1、Rank-lSsti的报错查询cycler没用被禁用,很常规的到达popen阶段{{cycler.__init__.__globals__.__builtins__[__import__](os).popen(ls).read()}}正常在浏览器中无法查看,使用pythonimport requestswith requests.Session() as session: url_phone = http://139.155.12…