AtCoder Beginner Contest 372

A - delete

思路

遇到'.'不输出就好

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    using namespace std;
    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef priority_queue<int> PQ;

    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

        string s;
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>s;
        for(auto i:s){
            if(i!='.')cout<<i;
        }


        return 0;
    }

B - 3^A

思路

看到3的幂求和,考虑向三进制转化

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    using namespace std;
    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef priority_queue<int> PQ;

    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int m;

    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>m;
        vector<int> v;
        vector<int> ans;
        while(m>0){
            int e=m%3;
            v.pb(e);
            m/=3;
        }
        int n=v.size();
        for(int i=0;i<n;i++){
            for(int j=1;j<=v[i];j++){
                ans.pb(i);
            }
        }
        cout<<ans.size()<<endl;
        for(auto i:ans)cout<<i<<" ";

        return 0;
    }

C - Count ABC Again

思路

每次操作至修改一处,前后有相似性且可转移,考虑动态规划(另外,由于下一层的推出只用到了上一层,考虑滚动数组优化空间,dp一维数组可简化为一个ans储存)

AC代码

    #include <bits/stdc++.h>
    #define endl '\n'
    #define int long long
    using namespace std;

    const int N = 2e5 + 10;

    int n, q;
    string s;
    int x;
    char c;
    int dp[N];

    int countABC(const string& str) {
        int count = 0;
        for (int i = 2; i <= n - 1; i++) {
            if (str[i] == 'A' && str[i + 1] == 'B' && str[i + 2] == 'C') {
                count++;
            }
        }
        return count;
    }

    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(0);

        cin >> n >> q;
        cin >> s;
        s = "DD" + s + "DD";  
        dp[0] = countABC(s);  

        for (int j = 1; j <= q; j++) {
            cin >> x >> c;
            int change = 0;
            x++;
            
            if (s[x] == 'A' && s[x + 1] == 'B' && s[x + 2] == 'C') change--;
            if (s[x] == 'B' && s[x - 1] == 'A' && s[x + 1] == 'C') change--;
            if (s[x] == 'C' && s[x - 1] == 'B' && s[x - 2] == 'A') change--;

            s[x] = c;

            if (c == 'A' && s[x + 1] == 'B' && s[x + 2] == 'C') change++;
            if (c == 'B' && s[x - 1] == 'A' && s[x + 1] == 'C') change++;
            if (c == 'C' && s[x - 1] == 'B' && s[x - 2] == 'A') change++;

            dp[j] = dp[j - 1] + change;
        }

        for (int i = 1; i <= q; i++) {
            cout << dp[i] << endl;
        }

        return 0;
    }

D - Buildings

思路

观察样例,枚举每一个位置的答案序列不难发现:每个序列都是单调递增,且序列还具有一些具有相似性,比如违反单调性的数据就像“被删除了”,不会出现,根据以上两点,考虑单调栈;进一步观察,前面答案的得出依赖于后面的元素,且由后至前的答案序列可推,故考虑反向输入操作,即考虑逆向的单调递减栈;答案就是栈的\(size\),注意答案回归正序

AC代码

    #include<bits/stdc++.h>
    #define endl '\n'
    #define int int long long
    #define pb push_back
    #define bs bitset
    using namespace std;
    typedef pair<char,int> PCI;
    typedef pair<int,int> PII;
    typedef priority_queue<int> PQ;

    const int N = 2e5+10, MAX = 1e9, INF = -1e9;

    int n;
    int h[N];
    stack<int> s;
    vector<int> v;
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n;
        for(int i=1;i<=n;i++)cin>>h[i];

        for(int i=n;i>=1;i--){
            int e=h[i];
            v.pb(s.size());
            while(!s.empty()&&e>s.top()){
                s.pop();
            }
            s.push(e);
            }
        for(int i=n-1;i>=0;i--){
            cout<<v[i]<<" ";
        }

        return 0;
    }

E - K-th Largest Connected Components

思路

并查集+线段树合并/平衡树

原题

找题解找到原题了[doge]:P3224 [HNOI2012] 永无乡

t.b.c.

posted @ 2024-09-22 16:16  Oaths  阅读(76)  评论(0)    收藏  举报