自学内容网 自学内容网

AtCoder ABC373 A-D题解

ABC372 的题解没写是因为 D 是单调栈我不会(⊙︿⊙)

比赛链接:ABC373

总结:wssb。听说 E 很水?有时间我看看。

Problem A:

Code

#include <bits/stdc++.h>
using namespace std;
int mian(){
int ans=0;
for(int i=1;i<=12;i++){
string S;
cin>>S;
if(S.size()==i)
ans++;
}
cout<<ans<<endl;
return 0;
}

Problem B:

甚至是先过的 C。wssb 题目没审清导致 WA 了 n 多次。。。

Sol

用一个 map 表示键盘即可。

Code

#include <bits/stdc++.h>
using namespace std;
string alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int main(){
string S;
cin>>S;
map<char,int> keyboard;
for(int i=0;i<S.size();i++)
keyboard[S[i]]=i+1;
int ans=0;
for(int i=0;i<25;i++)
ans+=(keyboard[alphabet[i]]-keyboard[alphabet[i+1]]);//abs
cout<<ans<<endl;
return 0;
}

Problem C:

好水的 C。放在 B 都不为过。

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int N;
cin>>N;
int a=0,b=0;//-2e9
for(int i=1;i<=N;i++){
int A;
cin>>A;
a=max(a,A);
}
for(int i=1;i<=N;i++){
int B;
cin>>B;
b=max(b,B);
}
cout<<a+b<<endl;
return 0;
}

Problem D:

水 D 但 wssb 把 dfs 的类型 void 写成了 int 导致一直 RE 最后到比赛结束才发现。。。乐

Sol

首先,由x_{v_j}-x_{u_j}=w_j可得x_{u_j}-x_{v_j}=-w_j

graph[u].push_back(make_pair(v,w));
graph[v].push_back(make_pair(u,-w));

然后我们用一个 vis 数组标记一个结点是否访问过。如果访问过就跳过,否则 dfs 计算该节点的值即可。

void dfs(int u){
vis[u]=true;
for(auto p:graph[u]){
if(!vis[p.first]){
val[p.first]=val[u]+p.second;
dfs(p.first);
}
}
}

Code

#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
vector<pair<int,int>> graph[maxn];
long long val[maxn];
bool vis[maxn];
int dfs(int u){
vis[u]=true;
for(auto p:graph[u]){
if(!vis[p.first]){
val[p.first]=val[u]+p.second;
dfs(p.first);
}
}
}
int main(){
int N,M;
cin>>N>>M;
for(int i=1;i<=M;i++){
int u,v,w;
cin>>u>>v>>w;
graph[u].push_back(make_pair(v,w));
graph[v].push_back(make_pair(u,-w));
}
for(int i=1;i<=N;i++){
if(!vis[i])
dfs(i);
}
for(int i=1;i<=N;i++)
cout<<val[i]<<' ';
return 0;
}

友情提醒:不要无脑Ctrl C+Ctrl V


原文地址:https://blog.csdn.net/seanli1008/article/details/142671103

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!