[题解]AtCoder Beginner Contest 416(ABC416) A~E
补题中~
A - Vacation Validation
枚举判定。
时间复杂度\(O(n)\)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s;
int n,l,r;
bool solve(){
for(int i=l;i<=r;i++) if(s[i]=='x') return 0;
return 1;
}
signed main(){
cin>>n>>l>>r>>s;
s=' '+s;
cout<<(solve()?"Yes\n":"No\n");
return 0;
}
B - 1D Akari
策略就是对于每一个.的连续段,选且仅选取其中一位置为o。
时间复杂度\(O(n)\)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
string s;
bool v=1;
signed main(){
cin>>s;
for(char i:s){
if(i=='.'){
if(v) cout<<"o",v=0;
else cout<<".";
}else{
cout<<"#";
v=1;
}
}
return 0;
}
C - Concat (X-th)
暴力枚举\(K^N\)种选择,然后nth_element或者排序来求第\(x\)小。
时间复杂度\(O(K^N\times N)\)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,k,x,idx,a[15];
string s[15],t[100010];
void dfs(int pos){
if(pos>k){
idx++;
for(int i=1;i<=k;i++) t[idx]+=s[a[i]];
return;
}
for(int i=0;i<n;i++){
a[pos]=i;
dfs(pos+1);
}
}
signed main(){
cin>>n>>k>>x;
for(int i=0;i<n;i++) cin>>s[i];
dfs(1);
sort(t+1,t+1+idx);
cout<<t[x]<<"\n";
return 0;
}
D - Match, Mod, Minimize 2
据题意,\(A_i,B_i<M\)。
所以对于我们重排的序列,如果记答案初始为\(\sum\limits_{i=1}^n A_i+B_i\),那么如果\(A_i+B_i\ge M\)则额外产生\(-M\)的贡献,否则不产生贡献。
所以我们是要让\(A_i+B_i\ge M\)的数量尽可能多。
因此我们将\(A,B\)排序,两个指针\(p_1,p_2\)分别指向\(A\)的最小值、\(B\)的最大值,匹配成功则都移动,并答案\(-M\),否则仅\(p_1\)移动。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int t,n,m,a[N],b[N];
signed main(){
cin>>t;
while(t--){
cin>>n>>m;
int ans=0;
for(int i=1;i<=n;i++) cin>>a[i],ans+=a[i];
for(int i=1;i<=n;i++) cin>>b[i],ans+=b[i];
sort(a+1,a+1+n),sort(b+1,b+1+n);
for(int i=1,j=n;i<=n;i++)
if(a[i]+b[j]>=m) ans-=m,j--;
cout<<ans<<"\n";
}
return 0;
}
E - Development
看到\(n\)的范围,想到使用Floyd求解,\(f[i][j]\)为\(i,j\)间的最短时间。
询问操作直接对着\(f[][]\)统计就行了。
加边操作也很好实现,每次加边\(O(n^2)\)地利用这条边重新松弛一遍即可。
再考虑建机场的操作。首先想到每建一个机场就和其他机场之间连一条权值为\(T\)的边,然后依次松弛。然而这样是\(O(n^3)\)的,无法接受。
但是这道题有一个很好的特性,就是机场之间构成了一个团(完全子图),意味着任意两个机场之间可以自由来往。所以两点之间的最短路,最多只能坐一次飞机。因为多次飞机一定可以用一次飞机上位替代。
因此我们重新定义\(f\)为不坐飞机的最短路,用\(g[i]\)表示离\(i\)最近的机场的距离,输出\((i,j)\)的答案时,和\(g[i]+g[j]+T\)取一次\(\min\)即可。
时间复杂度\(O(n^3+n^2q)\)。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=501;
int n,m,k,t,q,f[N][N],g[N];
bitset<N> is;
void ap(int u){//在u点建机场
is[u]=1;
for(int i=1;i<=n;i++){
g[i]=min(g[i],f[i][u]);
}
}
signed main(){
cin>>n>>m;
memset(f,0x3f,sizeof f),memset(g,0x3f,sizeof g);
for(int i=1,u,v,w;i<=m;i++){
cin>>u>>v>>w;
f[u][v]=f[v][u]=min(f[u][v],w);
}
for(int i=1;i<=n;i++) f[i][i]=0;
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
}
}
cin>>k>>t;
for(int i=1,u;i<=k;i++) cin>>u,ap(u);
cin>>q;
int op,x,y,z;
while(q--){
cin>>op;
if(op==1){
cin>>x>>y>>z;
f[x][y]=f[y][x]=min(f[x][y],z);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
f[i][j]=min({f[i][j],f[i][x]+f[y][j]+z,f[j][x]+f[y][i]+z});
if(is[j]) g[i]=min(g[i],f[i][j]);
}
}
}else if(op==2){
cin>>x;
ap(x);
}else{
int ans=0,s;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if((s=min(f[i][j],g[i]+g[j]+t))!=f[0][0]) ans+=s;
}
}
cout<<ans<<"\n";
}
}
return 0;
}
官方题解的思路是额外创建一个\(0\)号节点,任意机场到\(0\)号节点有一条权值为\(T\)的边,\(0\)号节点到任意机场有一条权值为\(0\)的边。这样建一个机场就相当于两次加边操作了。
F - Paint Tree 2
G - Concat (1st)
[题解]AtCoder Beginner Contest 416(ABC416) A~E的更多相关文章
- 题解 AtCoder Beginner Contest 168
小兔的话 欢迎大家在评论区留言哦~ AtCoder Beginner Contest 168 A - ∴ (Therefore) B - ... (Triple Dots) C - : (Colon) ...
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- [题解] Atcoder Beginner Contest ABC 265 Ex No-capture Lance Game DP,二维FFT
题目 首先明确先手的棋子是往左走的,将其称为棋子1:后手的棋子是往右走的,将其称为棋子2. 如果有一些行满足1在2右边,也就是面对面,那其实就是一个nim,每一行都是一堆石子,数量是两个棋子之间的空格 ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 153 题解
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- AtCoder Beginner Contest 173 题解
AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...
- AtCoder Beginner Contest 172 题解
AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...
随机推荐
- 【MySQL】字符串截取函数substring_index
业务场景描述:如何根据分隔符切割字符串?使用函数SUBSTRING_INDEX()根据指定分隔符切割,分隔符可以是字符串等. 语法:substring_index(str,delim,count) 说 ...
- K8s集群中的DNS服务(CoreDNS)详解
概述 官网文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/dns-pod-service/ 在 Kubernetes( ...
- 「Log」2023.9.25 小记
序幕 \(\text{6:40}\):准时到校,整理博客,今天少来点嘻嘻哈哈,认真做题了. \(\text{6:55}\):整理一下 POI 2011 题单. \(\text{7:10}\):开始板刷 ...
- Python 潮流周刊#105:Dify突破10万星、2025全栈开发的最佳实践
本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- Tauri2.0-DeepSeek电脑端Ai对话|tauri2+vite6+deepseek流式ai聊天系统
重磅新作tauri2.0+vue3.5+deepseek+arco桌面客户端ai流式输出聊天对话系统. tauri2-vue3-deepseek:桌面端ai聊天对话,基于Tauri2.x+Vite6集 ...
- Web前端入门第 73 问:JavaScript DOM 常用事件那点小事
网页上各种炫酷的交互效果离不开各种 DOM 事件 的支持,在写这篇文章之前,一度以为 JS 的事件绑定/取消方式就我知道的那几种,翻阅文档之后才发现,知识面还是有待提升,多翻翻文档,就像发现新大陆一样 ...
- Dataease2.10 二次开发详细步骤
一.DataEase简介 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务的改进与优化. DataEase 支持丰富的数据源连接,能够通过拖拉拽方式快速制 ...
- 分时间段(年份或月份)统计,没有数字补0 Java(替代 MYSQL) 做法
需求如下~ 输入年份,表格第一行 1-12 月 输入年份和月份 表格第一行 1--31 具体天数 表格第二行就是统计数量,没有补0. 看完首先想到MYSQL查询出连续一段时间和数量,没有 就为0. ...
- 尚硅谷SpringMVC学习笔记第10-13节(文件上传和下载、拦截器、异常处理器、注解配置SpringMVC)
转载于https://blog.csdn.net/weixin_57341232/article/details/126423746
- dotNet .Net Core 解决使用iframe框架登录超时跳转的登录界面还在iframe里
感谢:https://blog.csdn.net/duyunzhi/article/details/89215917 提供思路 感谢:https://q.cnblogs.com/q/111311 提问 ...