【Atcoder训练记录】AtCoder Beginner Contest 391
训练情况

赛后反思
悲了,C题看错题了,以为是神必DSU题,D题的模拟好难搞啊
A题
N对S,W对E,直接输出
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
string s; cin>>s;
map<char,char> v;
v['N'] = 'S';
v['S'] = 'N';
v['W'] = 'E';
v['E'] = 'W';
for(int i = 0;i<s.size();i++) cout<<v[s[i]];
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
B题
给定一个矩阵 \(S\) 和矩阵 \(T\),判断 \(T\) 是否包含在 \(S\),当中,输出左上角的那个点的坐标,我们直接枚举点的位置,判断是否相同
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,m; cin>>n>>m;
vector<string> s(n),t(m);
for(int i = 0;i<n;i++) cin>>s[i];
for(int i = 0;i<m;i++) cin>>t[i];
for(int i = 0;i+m-1<n;i++){
for(int j = 0;j+m-1<n;j++){
bool flag = true;
for(int k = 0;k<m;k++){
if(s[i+k].substr(j,m) != t[k]) flag = false;
}
if(flag){
cout<<i+1<<" "<<j+1<<endl;
return;
}
}
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C题
我们观察到对答案的贡献当且仅当巢中鸟的数量为 \(2\),所以我们维护移动前和移动后鸟所在的巢穴位置,维护巢穴中鸟的个数,计算答案的贡献
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,q; cin>>n>>q;
map<int,int> v;
map<int,int> cnt;
for(int i = 1;i<=n;i++) v[i] = i;
for(int i = 1;i<=n;i++) cnt[i] = 1;
int ans = 0;
while(q--){
int opt; cin>>opt;
if(opt == 1){
int x,y; cin>>x>>y;
if(cnt[v[x]]==2) ans--;
cnt[v[x]]--;
v[x] = y;
cnt[v[x]]++;
if(cnt[v[x]]==2) ans++;
} else if(opt == 2){
cout<<ans<<endl;
}
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}

浙公网安备 33010602011771号