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]]);//abscout<<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;//-2e9for(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
首先,由可得。
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;
}