AtCoder Beginner Contest 372 补题记录
A - delete
题意:
输出删除字符串中 .
后的字符串
思路:
只输出字符串中不是 .
的字符
void solve()
{
string s = sread();
for(auto it:s) if(it!='.') cout<<it;
cout<<endl;
}
B - 3^A
题意:
给出 M
, 求将M拆分成 N
个 3的 \(A_i\) 次方 相加
思路:
贪心,从大到小用 \(A_i\) 减M,最后一定能在 N<=20 范围内将M减为0
void solve()
{
int m = read();
int a = 10;
vector<int> ans;
while(m>0){
if(m >= pow(3,a)){
ans.push_back(a);
m -= pow(3,a);
}else {
a--;
}
}
cout<<ans.size()<<endl;
for(auto it:ans) write(it); ED;
}
C - Count ABC Again
题意:
给定字符串 \(S\) 和 \(Q\) 次询问,每次询问将字符串 \(S\) 的第 \(X\) 个字符更改为 \(C\),并输出每次更改后字符串中包含子串 \(ABC\) 的个数
思路:
- 每次询问都去统计子串的个数肯定会超时
- 只在初始统计一次子串的个数
- 考虑到每次修改都只会影响周围的几个字符,所以每次修改只会让子串的个数加一或减一或不加不减
- 当修改破坏了原本的子串时,\(cnt\) 减一
- 当修改形成了新的子串时, \(cnt\) 加一
void solve()
{
int n = read(), q = read();
string s = sread();
int cnt = 0;
for(int i=0;i<n-2;i++){
if(s[i] == 'A' && s[i+1] == 'B' && s[i+2] == 'C'){
cnt++;
}
}
auto del = [&](int x){
if((s[x] == 'A' && x < n-2 && s[x+1] == 'B' && s[x+2] == 'C')
|| (s[x] == 'B' && (x>0 && x<n-1) && s[x-1] == 'A' && s[x+1] == 'C')
|| (s[x] == 'C' && x > 1 && s[x-1] =='B' && s[x-2] == 'A'))
cnt --;
};
auto add = [&](int x,char c){
if((c == 'A' && x < n-2 && s[x+1] == 'B' && s[x+2] == 'C')
|| (c == 'B' && (x>0 && x<n-1) && s[x-1] == 'A' && s[x+1] == 'C')
|| (c == 'C' && x > 1 && s[x-1] =='B' && s[x-2] == 'A')){
cnt ++;
}
s[x] = c;
};
while(q--){
int x = read() - 1;
char c; cin>>c;
if(s[x] == c){
cout<<cnt<<endl;
continue;
}
del(x);
add(x, c);
cout<<cnt<<endl;
//cout<<s<<endl;
}
}
D - Buildings
题意:
给定 \(N\) 个建筑,依次求当 \(i = 1,2,...N\) 的时候 符合以下条件的 \(j\) 的个数
- \(i\) 和 \(j\) 之间没有比\(j\)更高的建筑物
思路-1:
- 考虑到 \(i\) 从1到N在不断删减元素比较复杂,就从后往前处理,每次增加一个元素
- 维护一个递增的序列,每次新增元素就把新元素前面的元素(比该元素小的元素)都删除,因为新的元素比这些元素考前而比他们大,必定不能符合条件(类似于优先队列的思想)该序列的大小就是每次符合条件的个数
- 具体用 \(set\) 容器来实现,每次新增元素就 lower_bound 找到该元素在递增序列的位置,并用迭代器将查到的位置前面的元素全部删除,时间复杂度 \(O(nlongn)\)
void solve()
{
int n = read();
vector<int> v;
for(int i=0;i<n;++i) v.emplace_back(read());
set<int> st;
vector<int> ans(n);
ans[n-1] = 0;
for(int i=n-1;i>0;i--){
auto it = st.lower_bound(v[i]);
if(it != st.end() && it != st.begin()){
it--;
while(it != st.begin()){
it--;
st.erase(next(it));
}
st.erase(it);
}else if(it == st.end()){
st.clear();
}
st.insert(v[i]);
ans[i-1] = st.size()
}
for(auto it:ans) write(it); ED;
}
思路-2:
实际上这就是个单调栈的板子题,不需要二分查找,直接用栈弹出前面小的元素就可以了
void solve()
{
int n = read();
vector<int> v;
for(int i=0;i<n;++i) v.emplace_back(read());
stack<int> st;
vector<int> ans(n);
ans[n-1] = 0;
for(int i=n-1;i>0;i--){
while(st.size() && st.top() < v[i]) st.pop();
st.push(v[i]);
ans[i-1] = st.size();
}
for(auto it:ans) write(it); ED;
}
E - K-th Largest Connected Components
题意:
有一个无向图,图中有 \(N\) 个顶点和 \(0\) 条边。顶点编号为 \(1\) 至 \(N\) 。
您会得到 \(Q\) 个查询,需要按顺序处理。每个查询属于以下两种类型之一:
- 类型 \(1\) :以
1 u v
格式给出。在顶点 \(u\) 和 \(v\) 之间添加一条边。 - 类型 \(2\) :格式为
2 v k
.打印与顶点 \(v\) 相连的顶点中 \(k\) 最大的顶点编号。如果连接到顶点 \(v\) 的顶点少于 \(k\) ,则打印-1
。
思路:
- 询问所有与顶点 \(v\) 相连的顶点中的最大顶点,所以考虑用并查集,顶点相连就加入同一集合
- 询问前 \(k\) 个顶点, \(1 \leq k \leq 10\) ,故考虑用大根堆维护每个集合,每次询问就弹出前k-1个元素查看堆顶 (也可以用平衡树来维护)
- 具体实现:只保留集合中祖宗顶点的大根堆,集合合并就把堆中元素少的集合并入元素多的集合
void solve()
{
int n = read(), q = read();
priority_queue<int> e[n+1];
vector<int> fa(n+1);
for(int i=1;i<=n;i++) e[i].push(i), fa[i] = i;
auto find = [&](auto find,int x) -> int{
return x == fa[x] ? x : (fa[x] = find(find,fa[x]));
};
auto merge = [&](int x,int y){
int fx = find(find,x), fy = find(find,y);
if(fx == fy) return;
if(e[fy].size() > e[fx].size()) swap(x,y), swap(fx,fy);
fa[fy] = x;
while(e[fy].size()){
e[fx].push(e[fy].top());
e[fy].pop();
}
};
while(q--){
int t = read();
if(t == 1){
int u = read(), v = read();
merge(u,v);
}else {
int v = read(), k = read();
int fv = find(find,v);
if(e[fv].size() < k){
cout<<-1<<endl;
continue;
}
queue<int> tmp;
while(k-- > 1){
tmp.push(e[fv].top());
e[fv].pop();
}
cout<<e[fv].top()<<endl;
while(tmp.size()){
e[fv].push(tmp.front());
tmp.pop();
}
}
}
}
AtCoder Beginner Contest 372 补题记录的更多相关文章
- AtCoder Beginner Contest 068 ABCD题
A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Regular Contest 151补题
AtCoder Regular Contest 151 A. Equal Hamming Distances 简单题,注意下答案需要字典序最小即可 #include<bits/stdc++.h& ...
- Yahoo Programming Contest 2019 补题记录(DEF)
D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...
- AtCoder Beginner Contest 069 ABCD题
题目链接:http://abc069.contest.atcoder.jp/assignments A - K-City Time limit : 2sec / Memory limit : 256M ...
- AtCoder Beginner Contest 050 ABC题
A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...
- AtCoder Beginner Contest 070 ABCD题
题目链接:http://abc070.contest.atcoder.jp/assignments A - Palindromic Number Time limit : 2sec / Memory ...
- AtCoder Beginner Contest 051 ABCD题
A - Haiku Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement As a New Yea ...
- AtCoder Beginner Contest 057 ABCD题
A - Remaining Time Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Dol ...
- AtCoder Beginner Contest 220部分题(G,H)题解
刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...
随机推荐
- dx12学习之旅-
记录一下,第一篇博客2024年7月26日下午. 计划在毕业后从事游戏开发的工作,现在在学习龙书dx12,平时会写一些对龙书内容上的一些理解.在读完全书之后,会考虑进行一次龙书相关的总结,不过这应该要很 ...
- CRYPTO-DSA
CRYPTO-DSA 参考某位大佬的博客和nss的一些题目,这两天的DSA题目 DSA数字签名 | DexterJie'Blog [NCTF 2021]dsa task.py from Crypto. ...
- 【Bug记录】uniapp开发时pages.json和manifest.json注释报错解决方案
pages.json和manifest.json注释报错问题解决 增强 pages.json和 manifest.json 开发体验 json文件写注释 用 VsCode 开发 uni-app 项目时 ...
- linux ln命令详解
介绍 ln是linux的一个重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...
- 【JDBC第6章】数据库事务理论
第6章:数据库事务 6.1 数据库事务介绍 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态. 事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方 ...
- Ubuntu 分辨率设置不了
最近换了个显示器,Ubuntu下竟然只能显示低分辨率,瞬间zhuo ji了,解决,留爪. 问题就不多说了,直接记录正题, 主要涉及2个命令cvt和xrandr, 主要注意的一点是:刚刚开始直接用命令写 ...
- Python字典及基本操作(超级详细)
今天小张帮大家简单介绍下Python的一种数据结构: 字典,字典是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据. 比如有份成绩表数据,语文:79,数学:80,英语:92,这组 ...
- 记录-内网部署vllm分布式推理DeepSeekR1:70b
背景 前段时间接到需求要在内网部署DeepSeekR1:70b,由于手里的服务器和显卡比较差(四台 四块Tesla T4- 16g显存的服务器),先后尝试了ollama.vllm.llamacpp等, ...
- markdown常用命令行格式
Markdown 主要命令(语法)如下: 标题 使用 # 号表示标题,# 的个数决定标题的级别: 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 & 换行 直接输入文字形成段 ...
- ApplicationContext 接口的实现类
ClassPathXmlApplicationContext: 它是从类的根路径下加载配置文件 推荐使用这种 FileSystemXmlApplicationContext: 它是从磁盘路径上加载配置 ...