[题解]AtCoder Beginner Contest 394(ABC394)

news/2025/2/23 0:14:13/文章来源:https://www.cnblogs.com/Sinktank/p/18731637

A - 22222

遍历字符串\(s\),按题意输出所有2即可。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
string s;
signed main(){cin>>s;for(auto a:s) if(a=='2') cout<<a;return 0;
}

B - cat

按题意模拟即可。

点击查看代码
#include<bits/stdc++.h>
#define N 60
using namespace std;
int n;
string s[N];
signed main(){cin>>n;for(int i=1;i<=n;i++) cin>>s[i];sort(s+1,s+1+n,[](string a,string b){return a.size()<b.size();});for(int i=1;i<=n;i++) cout<<s[i];return 0;
}

C - Debug

容易发现答案就是将原字符串所有形如WWW...WWWA的子串替换成ACCC...CCC,如此模拟即可得到答案。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s;
int n;
signed main(){cin>>s;n=s.size();int pos=-1;for(int i=0;i<n;i++){if(s[i]=='W'){if(pos==-1) pos=i;}else if(s[i]=='A'){if(~pos){cout<<"A";for(int j=pos;j<i;j++) cout<<"C";pos=-1;}else{cout<<"A";}}else{if(~pos){for(int j=pos;j<i;j++) cout<<s[j];pos=-1;}cout<<s[i];}}if(~pos){for(int j=pos;j<n;j++) cout<<s[j];pos=-1;}return 0;
}

上面是赛时思路,稍有点繁琐。实际上不难发现,我们可以直接倒序遍历字符串,遇到WA便修改成AC

这样做是正确的,因为每次修改只可能对之前的字符串产生影响。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s;
int n;
signed main(){cin>>s,n=s.size();for(int i=n-1;i>0;i--){if(s[i]=='A'&&s[i-1]=='W'){s[i]='C',s[i-1]='A';}}cout<<s;return 0;
}

D - Colorful Bracket Sequence

居然是括号匹配模板题w

具体过程如下,类似于模拟,所以正确性比较显然:

定义一个栈,初始为空。

对于\(i=1,2,\dots,n\),依次遍历\(s_i\)

  • 如果\(s_i\)是左括号,将\(s_i\)入栈。
  • 如果\(s_i\)是右括号,取出栈顶的左括号,看是否与\(s_i\)匹配。如果不匹配或者栈为空,断定No

如果最终栈非空,断定No,否则断定Yes

点击查看代码
#include<bits/stdc++.h>
using namespace std;
stack<char> st;
string s;
bool solve(){for(char i:s){if(i=='('||i=='['||i=='<'){st.push(i);}else{if(st.empty()) return 0;char c=st.top();st.pop();if(i==')'&&c!='(') return 0;if(i==']'&&c!='[') return 0;if(i=='>'&&c!='<') return 0;}}return st.empty();
}
signed main(){cin>>s;cout<<(solve()?"Yes":"No");return 0;
}

E - Palindromic Shortest Path

考虑到一个回文串的头尾各添加一个相同的字符,仍然是一个回文串,所以考虑使用BFS求解,队列里存的是形如\((u,v)\)的路径。

  • 先对于\(i=1,2,\dots,n\),将长度为\(0\)的路径\((i,i)\)加入队列,并令\(ans_{i,i}=0\)

  • 再对于\((u,v)\in E\),将长度为\(1\)的路径\((u,v)\)加入队列,并令\(ans_{u,v}=1\)

  • 接下来进行BFS,对于从队头取出的\((x,y)\)这条路径,枚举\(1\le i,j\le n\),若同时满足:

    • \(ans_{i,j}\)未被更新。
    • \((i,x),(y,j)\in E\)
    • \((i,x),(y,j)\)

    则令\(ans_{i,j}=ans_{x,y}+1\),并将\((i,j)\)入队。

由于我们保证队列中每个路径的\(ans\)从队头到队尾不降,所以\(ans_{i,j}\)第一次更新的值一定是最小的。自然正确性可以保证。

时间复杂度:最多\(O(n^2)\)次入队操作,枚举\(i,j\)\(O(n^2)\)的。所以时间复杂度是\(O(n^4)\)

点击查看代码
#include<bits/stdc++.h>
#define N 105
using namespace std;
int n,ans[N][N];
string a[N];
queue<pair<int,int>> q;
signed main(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i],a[i]=' '+a[i];memset(ans,-1,sizeof ans);for(int i=1;i<=n;i++) ans[i][i]=0,q.push({i,i});for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)if(i!=j&&a[i][j]!='-') ans[i][j]=1,q.push({i,j});while(!q.empty()){auto [x,y]=q.front();//注意 该写法仅c++17或以上可用q.pop();for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)if(ans[i][j]==-1&&a[i][x]==a[y][j]&&a[i][x]!='-')ans[i][j]=ans[x][y]+2,q.push({i,j});}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) cout<<ans[i][j]<<" ";cout<<"\n";}return 0;
}

\(O(n^4)\)居然是正解,难道哪里跑不满吗……?

F - Alkane

考虑树形dp。

由于一个烷烃只包含度为\(1,4\)的节点,当我们规定必须从子树\(u\)中选定一个包含\(u\)的连通块作为烷烃时,可能的形态只有下面两种:

所以我们考虑计算一个\(f\)数组,其中\(f_u\)表示从子树\(u\)中选定一个包含\(u\)的最大连通块,使得它是一个严格三叉树(非叶节点都有\(3\)个子节点)时,该连通块的大小。

\(f[u]\)的计算过程如下,其中\(ch\)表示\(u\)的子节点个数:

  • \(ch<3\)\(f_u=0\)
  • \(ch\ge 3\)\(f_u=f_{i_1}+f_{i_2}+f_{i_3}+1\)。其中\(i_x\)表示\(u\)的子节点中,\(f\)值第\(x\)大的节点。

然后就是计算答案了,讨论上图中\(2\)种情况。对于节点\(u\)

  • \(ch\ge 4\),有\(f_{i_1}+f_{i_2}+f_{i_3}+f_{i_4}+1\)的贡献,\(i\)的含义同上。
  • \(ch\ge 3\),且\(u\)不是根节点,有\(f_{i_1}+f_{i_2}+f_{i_3}+2\)的贡献。
点击查看代码
#include<bits/stdc++.h>
#define N 200010
using namespace std;
int n,ans,siz[N];
vector<int> G[N];
int dfs(int u,int fa){//返回值作为f[u]int maxx[4]={0};//维护前4大for(int i:G[u]){if(i==fa) continue;int t=dfs(i,u);siz[u]++;if(t>=maxx[0]) maxx[3]=maxx[2],maxx[2]=maxx[1],maxx[1]=maxx[0],maxx[0]=t;else if(t>=maxx[1]) maxx[3]=maxx[2],maxx[2]=maxx[1],maxx[1]=t;else if(t>=maxx[2]) maxx[3]=maxx[2],maxx[2]=t;else if(t>=maxx[3]) maxx[3]=t;}if(siz[u]<=2) return 1;if(siz[u]>=4) ans=max(ans,maxx[0]+maxx[1]+maxx[2]+maxx[3]+1);if(u!=1) ans=max(ans,maxx[0]+maxx[1]+maxx[2]+2);return maxx[0]+maxx[1]+maxx[2]+1;
}
signed main(){cin>>n;for(int i=1,u,v;i<n;i++){cin>>u>>v;G[u].emplace_back(v);G[v].emplace_back(u); }dfs(1,0);cout<<(ans?ans:-1)<<"\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888238.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitOps项目上篇之Argo CD环境准备

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.GitOps概述1.什么是GitOps2.基于Argo实现GitOps方案架构二.GitOps项目环境准备实战案例1.主机角色规划2.部署gitlab相关环境3.部署k8s相关环境4.部署ArgoCD默认启用tls环境基于NodePort暴露4.1 Argo概…

[tldr] 配置windows terminal使用git bash

windows terminal默认使用power shell作为shell,但是power shell不好用,还是习惯linux的命令行行为. 参考Windows Terminal 配置 Git Bash 添加新的配置文件在windows terminal中点击设置选项点击添加配置文件按钮编辑配置内容 一个配置文件主要来自之前的配置文件的内容主要分…

【原创工具】文件清单生成器 By怜渠客

【原创工具】文件清单生成器 By怜渠客 刚在论坛看到了一个文件列表生成器 https://www.52pojie.cn/thread-2008605-1-1.html ,和我去年写的一个软件很像,当时我也是有需求,要把一个文件夹里及其子文件夹里所有的文件列出来,就临时弄了个小软件,现在我重新修复完善了一下,…

windows使用命令行管理进程

前言 在windows中,我们通常使用GUI图形画面的任务管理器来管理进程。 任务管理器提供了一个较为友好的图形界面,然而他也存在一定问题。 首先,任务管理器就要吃掉一部分性能。 而且,当你在任务管理器页面,点击按名称排序时,那可能会出现灾难性的卡顿,这对一台旧电脑来说…

postman的几种参数化

1.环境变量方式设置:创建环境:点击 Postman 右上角的 Environments > Create New。输入环境名称(如 Dev、test),并添加键值对(如 base_url: https://api.vvhan.com)。使用变量:在请求 URL 或请求体中用双花括号引用变量:{{base_url}}/users。切换环境时,变量会自动…

第十五届蓝桥杯省赛

第十五届蓝桥杯省赛 1.握手问题#include <iostream> using namespace std; int main() { //划分为43,7两组 //(43*42)/2+7*43=28*43 cout<<28*43;return 0; }2.小球反弹(难)分析: 当做两个方向往返代码:/* 考点:速度分解 分解为x轴往返,y轴往返(回到左上角起…

OpenWRT安装Caddy实现WebDAV协议的NAS盘

Caddy带有WebDAV插件,可以安装在OpenWRT上,用于提供WebDAV协议的NAS服务。 Windows资源管理器,WinSCP,MAC的Finder,Android上的CX文件管理器都可以作为WebDAV的客户端。 WebDAV使用过程中可以直接打开文件,修改后保存,非常方便,感觉Samb没区别。但其使用https协议,安全…

Java17的安装

Java17的安装因为要用SpringBoot3了,Java版本要更新到17以后 安装连接:Java Archive Downloads - Java SE 17.0.12 and earlier 下载 选择对应的版本下载安装可以更改安装位置成功以后关闭就行配置环境变量 如果电脑已经安装了JDK8,但又不想卸载的同时想安装JDK17,可以如下…

linux中nano和vim用法

Linux下nano,vim使用Linux 编辑器使用指南:nano 和 vim 在 Linux 系统中,编辑文本文件是非常常见的任务。对于大多数 Linux 用户来说,nano 和 vim 是两个最常用的命令行文本编辑器。虽然它们都可以用来编辑文件,但它们的功能和使用方式有很大不同。本篇文章将介绍这两个编辑…

final关键字、Object类

1.规则 被final修饰的变量,名称都要大写,多单词的名称则需_来分隔1.修饰方法method方法已经不能被重写了,因为修饰该方法的是final2.修饰类 当一个类中所有的成员方法都不想被重写时,可以直接在类上加上final,无需再一个一个写在方法上2.object类: 是所有类的祖宗,每一个…

Java要记-持续补充中

1. ArrayList操作自定义对象进行removeAll()时,移除失效原因 由于底层最用调用的是Object的equals()方法进行比较的,比较的是地址,两个对象地址当然是不同的了,移除自然会失败。解决方案:重写equals方法。【注意重写equals方法记得也要重写hashCode方法】同时:retainAll(…

this和super--java进阶day01

1.this和super的代表super是父类的标识符,如堆内存中的标志 2.this和super的访问重点说访问构造方法,super()访问父类构造方法我们已经清楚,但是this()访问本类构造方法,我们不清楚有什么用意义 如以下情境 假设在公司制作一个系统,1.0有三位角色随着版本更新,1.1要新…