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,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...
随机推荐
- Fermat
[KPCTF 2024]ez_fermat from Crypto.Util.number import * p = getPrime(1024) q = getPrime(813) n = p * ...
- AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
引言 人工智能(AI)技术的迅猛发展推动了各行各业的数字化转型.图像分类,作为计算机视觉领域的核心技术之一,能够让机器自动识别图像中的物体.场景或特征,已广泛应用于医疗诊断.安防监控.自动驾驶和电子商 ...
- Qt 实现带阴影 无边框的QMessageBox
Qt 实现带阴影的QMessagebox 在实际项目里面使用到了QMessageBox做一个弹窗,最开始是样式不是需要的样式,就去找了一下QMessageBox的样式表,一般来说可以使用findChi ...
- js回忆录(2) -- 逻辑表达式,条件语句
之所以要把逻辑表达式和条件语句放一块写一下,完全是因为二者的联系太过紧密,逻辑运算产生布尔值的结果,而条件语句则根据布尔值决定走那个分支. 逻辑与: &&, 首先逻辑与有逻辑与运算功能 ...
- Linux重启php-fpm
前言 PHP-FPM 是一款简单好用的 PHP FastCGI 进程管理工具. 它可以和 Apache.Nginx 或其他服务器一起构建完整的 PHP 环境. 接下来我们看看在更改了 php.ini ...
- linux安装python centos
下载安装包 可以到官网 ftp 地址,复制指定 python 版本源码安装包下载链接 https://www.python.org/ftp/python/ 或者到官网 downloads, 复制指定 ...
- 容器引擎-Docker
Docker是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级.可移植的.自给自足的容器.Docker类似于集装箱,各式各样的货物,经过集装箱的标准化进行托管,而集装箱和集装箱之间没有影响. ...
- Linux升级openssl、openssh
在项目中,我们经常会发现Linux系统中Open SSH.Open SSL存在高危漏洞,如OpenSSL"心脏出血"漏洞,利用该漏洞,黑客可以获取约30%的https开头网址的 ...
- Coupled Iterative Refinement for 6D Multi-Object Pose Estimation论文精读
目录 Coupled Iterative Refinement for 6D Multi-Object Pose Estimation论文精读 论文介绍 Abstract Introduction Re ...
- 【Linux】5.10 输入输出重定向
Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令 ...