AtCoder Beginner Contest 380 (A~E)题解
A - 123233
遍历字符串统计出现次数即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int n, m, k;
int a[N];
signed main() {
string s;
cin >> s;
map<char, int> mp;
for (auto t : s) {
mp[t]++;
}
if (mp['2'] == 2 && mp['1'] == 1 && mp['3'] == 3) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
B - Hurdle Parsing
直接计数,遇到 $ | $ 输出即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int n, m, k;
int a[N];
signed main() {
string s;
cin >> s;
int cnt = 0, f = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '|') {
if (f == 1)
cout << cnt << ' ';
cnt = 0;
f = 1;
}
if (s[i] != '|') {
cnt++;
}
}
}
C - Move Segment
题意是将第 $ k $ 个连续的字符 $ 1 $ 段与第 $ k-1 $个段合并。
用 $ vector $ 存储一下连续的每一段然后根据题目要求顺序即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int n, m, k;
int a[N];
signed main() {
string s;
cin >> n >> k;
cin >> s;
string now1 = "", now2 = "";
vector<string> a;
for (int i = 0; i < n; i++) {
if (s[i] == '1') {
now1 += s[i];
if (now2.size() != 0) {
// cout << now2 << '\n';
a.push_back(now2);
now2 = "";
}
}
if (s[i] == '0') {
now2 += s[i];
if (now1.size() != 0) {
a.push_back(now1);
// cout << now1 << '\n';
now1 = "";
}
}
}
if (now1.size())
a.push_back(now1);
if (now2.size())
a.push_back(now2);
// for (auto t : a) {
// cout << t << ' ';
// }
cout << '\n';
int cnt = 0, d1 = 0, d2 = 0;
for (int i = 0; i < a.size(); i++) {
if (a[i][0] == '1') {
cnt++;
if (cnt == k - 1) {
d1 = i;
}
if (cnt == k) {
d2 = i;
for (int j = 0; j <= d1; j++) {
cout << a[j];
}
cout << a[d2];
for (int j = d1 + 1; j < a.size(); j++) {
if (j != d2) {
cout << a[j];
}
}
return 0;
}
}
}
}
D - Strange Mirroring
利用对称的思想,观察每次查询的第 $ k $ 个字符最初是由哪个字符演变过来的,并记录演变次数,根据次数判断字符大小写。可以观察发现,每次我们都可以通过对称使得字符串长度减少 $ n*2^x $ 的长度,该长度通过二分查找,多次缩短我们便能找到最初的字符。
时间复杂度:$ O(q*log k) $。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int n, m, k;
int a[N];
int b[100];
signed main() {
string s;
cin >> s;
n = s.size();
s = ' ' + s;
int q;
cin >> q;
vector<int> a;
int x = n;
for (int i = 1; i <= 64; i++) {
if (x > 1e18) break;
a.push_back(x);
x *= 2;
}
for (int i = 0; i < a.size(); i++) {
b[i + 1] = a[i];
}
while (q--) {
cin >> k;
int d = 0;
int cnt = 0;
for (int i = 1; i <= 100; i++) {
int x = lower_bound(b + 1, b + 1 + (int)a.size(), k) - b;
x -= 1;
k -= b[x];
// cout << x << '\n';
if (b[x] != 0)
cnt++;
if (k <= n) break;
}
// cout << k << '\n';
// cout << cnt << '\n';
char x = s[k];
if (cnt % 2 == 0) {
cout << x << ' ';
} else {
if (x >= 'a' && x <= 'z')
cout << (char)(x - 32) << ' ';
else
cout << (char)(x + 32) << ' ';
}
// cout << '\n';
}
}
E - 1D Bucket Tool
使用两个 $ set $ 维护 $ l $ 和 $ r $ 区间,用 $ set<pair<int,int>> $ 维护存在的颜色的区间,使用 $ map<pair<int,int>> $ 维护颜色区间的颜色。每次修改通过二分查找出 $ x $ 分类讨论所在区间段再根据左右区间段颜色 $ c $ ,判断是否需要合并区间,每次修改完成后更新 $ sum $ 数组的值,不断维护 $ stl $ 容器的值,注意不要出现越界的问题,思路不乱维护好就可以了。
真是一次酣畅淋漓的 $ set $ 练习
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int n, m, k;
int sum[N];
set<pair<int, int>> col;
set<int> sel, ser;
map<pair<int, int>, int> mp;
void work(pair<int, int> l, pair<int, int> b, pair<int, int> r, int x) {
sel.erase(l.first), sel.erase(b.first), sel.erase(r.first);
ser.erase(l.second), ser.erase(b.second), ser.erase(r.second);
int a = mp[ {l.first, l.second}], bt = x, c = mp[ {r.first, r.second}];
int be = mp[ {b.first, b.second}];
sum[be] -= b.second - b.first + 1;
sum[x] += b.second - b.first + 1;
if (a == bt && bt == c) {
pair<int, int> f = {l.first, r.second};
mp.erase(b), mp.erase(l), mp.erase(r);
mp[f] = x;
col.erase(l), col.erase(r), col.erase(b);
col.insert(f);
sel.insert(l.first), ser.insert(r.second);
} else if (a == bt) {
pair<int, int> f = {l.first, b.second};
mp.erase(b), mp.erase(l);
col.erase(b), col.erase(l);
mp[f] = x;
col.insert(f);
sel.insert(l.first), ser.insert(b.second);
sel.insert(r.first), ser.insert(r.second);
} else if (bt == c) {
pair<int, int> f = {b.first, r.second};
mp.erase(b), mp.erase(r);
col.erase(b), col.erase(r);
mp[f] = x;
col.insert(f);
sel.insert(b.first), ser.insert(r.second);
sel.insert(l.first), ser.insert(l.second);
} else {
pair<int, int> f = {b.first, b.second};
mp[f] = x;
sel.insert(r.first), ser.insert(r.second);
sel.insert(l.first), ser.insert(l.second);
sel.insert(b.first), ser.insert(b.second);
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
sel.insert(i), ser.insert(i);
col.insert({i, i});
mp[ {i, i}] = i;
sum[i] += 1;
}
while (m--) {
int op, x, c;
cin >> op;
if (op == 1) {
cin >> x >> c;
auto it1 = sel.lower_bound(x);
auto it2 = ser.lower_bound(x);
if (it1 == sel.end()) {
it1 = --sel.end();
}
if (*it1 > x) it1--;
auto it3 = col.lower_bound({*it1, *it2});
pair<int, int> b = *it3, l, r;
pair<int, int> ed = *--col.end(), be = *col.begin();
if (b != ed) {
it3++;
auto t = col.lower_bound(*it3);
it3--;
r = *t;
}
if (b != be) {
it3--;
auto t = col.lower_bound(*it3);
it3++;
l = *t;
}
work(l, b, r, c);
} else {
cin >> c;
cout << sum[c] << '\n';
}
}
}
AtCoder Beginner Contest 380 (A~E)题解的更多相关文章
- AtCoder Beginner Contest 238 A - F 题解
AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...
- AtCoder Beginner Contest 221 A~E题解
目录 A - Seismic magnitude scales B - typo C - Select Mul D - Online games E - LEQ 发挥比较好的一场,就来搓篇题解. F ...
- AtCoder Beginner Contest 215 F题题解
F - Dist Max 2 什么时候我才能突破\(F\)题的大关... 算了,不说了,看题. 简化题意:给定\(n\)个点的坐标,定义没两个点的距离为\(min(|x_i-x_j|,|y_i-y_j ...
- AtCoder Beginner Contest 213 F题 题解
F - Common Prefixes 该题也是囤了好久的题目了,看题目公共前缀,再扫一眼题目,嗯求每个后缀与其他后缀的公共前缀的和,那不就是后缀数组吗?对于这类问题后缀数组可是相当在行的. 我们用后 ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 153 题解
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- AtCoder Beginner Contest 173 题解
AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...
随机推荐
- MAC地址格式详解
以太网编址 在数据链路层,数据帧通常依赖于MAC地址来进行数据交换,它如同公网IP地址一样要求具有全球唯一性,这样才可以识别每一台主机.那么MAC地址如何做到这点?它的格式又是什么? MAC地址,英文 ...
- github拉取项目执行npm i 失败的问题
一般卡在core-js没反应,然后报错的第一行是和node-sass有关的,基本上都是node-sass版本问题,这时候只需要在命令行输入两行代码就行 先把原来的依赖删掉 npm uni node-s ...
- Go 闭包捕获问题
在 Go 语言中,闭包(closure)是一个函数值,它引用了其外部作用域中的变量.简而言之,闭包能够"捕获"并"记住"其外部作用域中的变量,即使这个变量的生命 ...
- 解密华为问界M7 Pro:智能出行的全新里程碑与技术亮点
解读华为问界M7 Pro的智能里程碑 引言 2024年8月,智能出行领域迎来了一个激动人心的时刻--问界M7 Pro的重磅发布.这款智能SUV,不仅是华为在汽车领域的又一次大胆尝试,更是鸿蒙智行系统的 ...
- 根据Uri,Cursor没有获取到对应的属性
Android: 背景:调用摄像头,拍摄视频,指定保存的地址,但是返回的Cursor文件,只有名称和大小的属性,没有其他诸如时长,连ID属性都没有 使用 cursor.getInt(cursor.ge ...
- 如何保证 Redis 的高并发和高可用?讨论redis的单点,高可用,集群
如何保证 Redis 的高并发和高可用?讨论redis的单点,高可用,集群. 打开GitHub搜索redis,边可以看到,该项目的介绍是这样的: Redis is an in-memory datab ...
- webpack笔记-生产环境与开发环境常用plugin介绍(五)
mode 和 plugin 前边我们介绍 mode 时提过,mode 不同值会影响 webpack 构建配置,其中有一个就是会启用 DefinePlugin 来设置process.env.NODE_E ...
- [CL-FOOL] CLOI 愚人赛的部分官方题解与小杂谈
小细节 谁会拿 Rank 奖励? 头图里有写哦. 发现没有,这里的问号是蓝色的,点进去可以进到彩蛋界面. 当然彩蛋界面也什么都没有,提交界面藏在下面的源码里. 那么交什么呢. CLOI 的文件里有一团 ...
- Java日期时间API系列16-----Jdk8中java.time包中的新的日期时间API类,java日期计算3,日期中年月日时分秒的属性值修改等
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- 2022年最新数据库调查报告:超八成DBA月薪过万,你拖后腿了吗?
数据库管理员属于IT行业高薪职业的一种,近几年关于数据库管理员的薪资统计文章也层出不穷,那么当前,DBA们的薪资究竟到达了怎样的水平呢? 墨天轮数据社区发布最新<2022年墨天轮数据库大调查报告 ...