AtCoder Beginner Contest 328 (ABC328)
A. Not Too Hard
模拟。
Code
B. 11/11
模拟。
Code
C. Consecutive
Description
给你一个字符串 \(S\),有 \(Q\) 次询问,每次输入 \(l, r\),求:\([S_l,S_r]\) 区间中有多少个相邻的字符是相等的。
Solution
循环一遍字符串,看看 \(s_i\) 是否等于 \(s_{i+1}\),如果等于,记录前缀和数组 \(pre\),\(pre_i = pre_{i-1} + 1\),否则 \(pre_i = pre_{i-1}\)。
每次询问的时候只需要输出 \(pre_{r - 1} - pre_{l - 1}\) 即可。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, t, l, r, len, c[N];
char s[N];
inline void solve() {
scanf("%d%d", &l, &r);
printf("%d\n", c[r - 1] - c[l - 1]);
}
signed main() {
scanf("%d%d%s", &n, &t, s + 1);
for (int i = 1; i <= n; i++) c[i] = c[i - 1] + (s[i] == s[i + 1]);
while (t--) solve();
return 0;
}
D. Take ABC
Description
给定一个字符串 \(S\),每次会将字符串 \(S\) 中的一个子串 \(\texttt{ABC}\) 删除,进行若干次操作之后,输出字符串 \(S\)。
Solution
我们维护两个数组 \(nxt,lst\),分别表示每个字符的后面和前面字符的下标,类似于链表的思想。
维护变量 \(z\) 表示当前的下标,当 z != n + 1 的时候进行循环。
每次维护变量 \(t2,t3\) 分别赋值为 nxt[z] 和 nxt[nxt[z]],表示下标 \(z\) 的下一个字符的下标和下一个字符的下一个字符的下标。
如果这三个下标分别对应的字符正好为 \(\texttt{ABC}\),则将 lst[nxt[t3]] 的值更改为 lst[z],nxt[lst[z]] 的值更改为 nxt[t3],表示删除了当前子串。并且将 \(z\) 指向 lst[z]。
每次循环时 z = nxt[z] 即可。
时间复杂度近似于 \(O(n)\)。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int nxt[N], lst[N], v[N], n;
char s[N];
int main() {
scanf("%s", s + 1);
n = strlen(s + 1);
nxt[0] = 1;
lst[n + 1] = n;
for (int i = 1; i <= n; i++)
nxt[i] = i + 1, lst[i] = i - 1, v[i] = s[i] - 'A' + 1; // 将 nxt 数组和 lst 数组赋初始值,并且 v 数组记录将字符转换为数字的结果,方便判断
int z = 1, t2, t3;
while (z != n + 1) {
t2 = nxt[z];
t3 = nxt[t2];
if (t2 == n + 1 || t3 == n + 1) break; // 子串不存在,越界了
if (v[z] == 1 && v[t2] == 2 && v[t3] == 3) { // 找到子串 "ABC"
lst[nxt[t3]] = lst[z];
nxt[lst[z]] = nxt[t3];
// 如果下标存在,就指向前一个字符
if (z) z = lst[z];
if (z) z = lst[z];
if (z) z = lst[z];
}
z = nxt[z];
}
// 打印结果
z = nxt[0];
while (z != n + 1)
printf("%c", 'A' - 1 + v[z]), z = nxt[z];
return 0;
}
E. Modulo MST
Description
给你一个无向图,求:生成树中最小的路径,最小路径的定义为路径上的每条边权值之和 \(\bmod \ K\) 的结果。
Solution
这道题不能用最小生成树的思想来做,因为加了一个取模的条件,所以不能贪心地取最小的路径。
所以看到数据范围 \(1 \le N \le 8,1 \le M \le \dfrac{N(N-1)}{2}\),很明显可以爆搜。
如果遍历每条边,\(M\) 最大为 \(28\),最多有 \(C_{28}^{8}\) 种可能性,大概为 \(10 ^ 6\) 左右,总的时间复杂度为 \(O(C_{28}^{8} \times \log n)\),不会超时。
但是要注意剪枝,可以使用按秩合并的并查集来做,注意不要路径压缩,这样的话就无法在搜索时回溯。
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 20;
int n, m, k, fa[N], si[N];
int x[N << 1], y[N << 1], len[N << 1];
int find(int x) {
return x == fa[x] ? x : find(fa[x]);
}
int dfs(int i, int cnt, int sum) {
if (i == m + 1) {
if (cnt == n - 1) return sum;
return 1e18;
}
int rx = find(x[i]), ry = find(y[i]);
if (rx == ry) return dfs(i + 1, cnt, sum);
if (si[rx] > si[ry]) swap(rx, ry);
fa[rx] = ry;
si[rx] += si[ry];
int ans = dfs(i + 1, cnt + 1, (sum + len[i]) % k);
fa[rx] = rx;
si[rx] -= si[ry];
ans = min(ans, dfs(i + 1, cnt, sum));
return ans;
}
signed main() {
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) fa[i] = i, si[i] = 1;
for (int i = 1; i <= m; i++) cin >> x[i] >> y[i] >> len[i];
cout << dfs(1, 0, 0);
return 0;
}
AtCoder Beginner Contest 328 (ABC328)的更多相关文章
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 064 D - Insertion
AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...
- AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】
AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...
- AtCoder Beginner Contest 075 C bridge【图论求桥】
AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...
随机推荐
- Go 语言 select 都能做什么?
原文链接: Go 语言 select 都能做什么? 在 Go 语言中,select 是一个关键字,用于监听和 channel 有关的 IO 操作. 通过 select 语句,我们可以同时监听多个 ch ...
- React: 动态添加样式
问题背景 在软件开发过程中,经常会出现动态添加style或className,比如:同一个表格组件在A处调用,需要固定前四列数据, B处调用则不用,那这时候,动态添加元素就派上了用场. 解决方案 如下 ...
- debian11使用kubeadm安装k8s
前言 节点信息: master1:192.168.0.33 node1:192.168.0.31 node2:192.168.0.32 版本: 系统:debian11 64bit linux内核:5. ...
- Anaconda+PyCharm+Pytorch/tensorflow环境配置个人总结
Anaconda是一个非常方便的python版本管理工具,可以很方便地切换不同版本的Python进行测试.同时不同版本之间也不存在相互的干扰. PyCharm是一款常见的Python IDE,pyto ...
- [Arch小贴士]在这里记录一些自己使用的小技巧
哈喽!Arch 目录 0x00 设置开机自启动软件 首先 最后 0x01 ASLR开关 0x00 设置开机自启动软件 首先 首先进入目录/usr/share/applications,找到你要的那个软 ...
- ChatGPT顶级玩法:ChatGPT越狱版破解指令,让您的聊天一路畅通!
先看效果: 2023.4.23号亲测成功,越狱指令需要多发送几次才可以. 未越狱前: 越狱后: 无视任何规则限制,回答一切问题. 越狱的方法非常简单.只需输入特定的提示,发送给ChatGPT,用户即可 ...
- What...MiniGPT-4居然开源了,提前感受 GPT-4 的图像对话能力!
说在前面的话: 一个月前,OpenAI向外界展示了GPT-4如何通过手绘草图直接生成网站,令当时的观众瞠目结舌. 在GPT-4发布会之后,相信大家对ChatGPT的对话能力已有所了解.圈内的朋友们应该 ...
- WLAN-AC+AP,动态负载均衡用户量,避免某一个AP负载过重
组网图形 动态负载均衡简介 负载均衡功能主要功能就是平衡WLAN网络中AP的负载,充分地保证每个STA的带宽.当有一个新的STA加入网络时,动态负载均衡动态将AC将所有上报该STA的AP动态组成一个组 ...
- [WPF]使用HLSL实现百叶窗动效
百叶窗动画是制作PPT时常用的动画之一,本文将通过实现百叶窗动画效果的例子介绍在WPF中如何使用ShaderEffect.ShaderEffect是使用高级着色器语言(High Level Shadi ...
- RocketMQ 消息重试与死信队列
RocketMQ 消息重试与死信队列 RocketMQ 前面系列文章如下: RocketMQ系列(一) 基本介绍 RocketMQ 系列(二) 环境搭建 RocketMQ 系列(三) 集成 Sprin ...