【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;
}
posted @ 2025-02-01 21:45  MNNUACM_2024ZY  阅读(97)  评论(0)    收藏  举报