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,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...
随机推荐
- 从文件到块: 提高 Hugging Face 存储效率
Hugging Face 在 Git LFS 仓库 中存储了超过 30 PB 的模型.数据集和 Spaces.由于 Git 在文件级别进行存储和版本控制,任何文件的修改都需要重新上传整个文件.这在 H ...
- C语言线程池的常见实现方式详解
在 C 语言中,线程池通常通过 pthread 库来实现.以下是一个详细的说明,介绍了 C 语言线程池的常见实现方式,包括核心概念.实现步骤和具体的代码示例. 点击查看代码 1. 线程池的基本结构 线 ...
- 对接服务升级后仅支持tls1.2,jdk1.7默认使用tls1.0,导致调用失败
背景 如标题所说,我手里维护了一个重要的老项目,使用jdk1.7,里面对接了很多个第三方服务,协议多种多样,其中涉及http/https的,调用方式也是五花八门,比如:commons-httpclie ...
- 三分钟构建高性能WebSocket服务 | 超优雅的Springboot整合Netty方案
前言 每当使用SpringBoot进行Weboscket开发时,最容易想到的就是spring-boot-starter-websocket(或spring-websocket).它可以让我们使用注解, ...
- AXUI一个面向设计的UI前端框架,好用
以下是官方介绍: ax的中文意义是:斧子,读音[aeks],取其攻击力强.简单实用之意为本前端框架命名.本团队开发了诸多网站项目,使用了许多常见的前端框架,结合实际项目经验,借鉴了同行的经验,特自主开 ...
- 一次Java后端服务间歇性响应慢的问题排查记录
分享一个之前在公司内其它团队找到帮忙排查的一个后端服务连接超时问题,问题的表现是服务部署到线上后出现间歇性请求响应非常慢(大于10s),但是后端业务分析业务日志时却没有发现慢请求,另外由于服务容器li ...
- 史上最全EffectiveJava总结(一)
创建和销毁对象 1.静态工厂方法代替构造器 优点 静态工厂方法有名称,能确切地描述正被返回的对象. 不必每次调用都创建一个新的对象. 可以返回原返回类型的任何子类对象. 创建参数化类型实例时更加简洁, ...
- WebGL 的简易入门教程
目录 前言 第一节 绘制出了一个点 效果演示 逐行解释 向量类型 第二节 动态传递点数据 变量修饰符 完整代码 第三节 缓冲区和画线 类型化数组 绘制的方式 完整代码 第四节 彩色线段 精度修饰符 完 ...
- spring的三级缓存
spring的三级缓存: Spring 容器的"三级缓存" Spring 容器的整个生命周期中,单例Bean对象是唯一的.即可以使用缓存来加速访问 Spring 源码中使用了大量的 ...
- 【Linux】5.10 输入输出重定向
Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令 ...