首页 > 其他分享 >AtCoder Beginner Contest 372 补题记录

AtCoder Beginner Contest 372 补题记录

时间:2024-09-23 09:47:14浏览次数:1  
标签:AtCoder Beginner int 元素 st -- 补题 && ans

A - delete

题意:

输出删除字符串中 . 后的字符串

思路:

只输出字符串中不是 . 的字符

void solve()
{
    string s = sread();
    for(auto it:s) if(it!='.') cout<<it;
    cout<<endl;
}

B - 3^A

题意:

给出 M , 求将M拆分成 N 个 3的 \(A_i\) 次方 相加

思路:

贪心,从大到小用 \(A_i\) 减M,最后一定能在 N<=20 范围内将M减为0

void solve()
{
    int m = read();
    int a = 10;
    vector<int> ans;
    while(m>0){
        if(m >= pow(3,a)){
            ans.push_back(a);
            m -= pow(3,a);
        }else {
            a--;
        }
    }

    cout<<ans.size()<<endl;
    for(auto it:ans) write(it); ED;
}

C - Count ABC Again

题意:

给定字符串 \(S\) 和 \(Q\) 次询问,每次询问将字符串 \(S\) 的第 \(X\) 个字符更改为 \(C\),并输出每次更改后字符串中包含子串 \(ABC\) 的个数

思路:

- 每次询问都去统计子串的个数肯定会超时
- 只在初始统计一次子串的个数

  • 考虑到每次修改都只会影响周围的几个字符,所以每次修改只会让子串的个数加一或减一或不加不减
    - 当修改破坏了原本的子串时,\(cnt\) 减一
    - 当修改形成了新的子串时, \(cnt\) 加一
void solve()
{
    int n = read(), q = read();
    string s = sread();

    int cnt = 0;
    for(int i=0;i<n-2;i++){
        if(s[i] == 'A' && s[i+1] == 'B' && s[i+2] == 'C'){
            cnt++;
        }
    }

    auto del = [&](int x){
        if((s[x] == 'A' && x < n-2 && s[x+1] == 'B' && s[x+2] == 'C')
        || (s[x] == 'B' && (x>0 && x<n-1) && s[x-1] == 'A' && s[x+1] == 'C')
        || (s[x] == 'C' && x > 1 && s[x-1] =='B' && s[x-2] == 'A'))
            cnt --;
    };

    auto add = [&](int x,char c){
        if((c == 'A' && x < n-2 && s[x+1] == 'B' && s[x+2] == 'C')
        || (c == 'B' && (x>0 && x<n-1) && s[x-1] == 'A' && s[x+1] == 'C')
        || (c == 'C' && x > 1 && s[x-1] =='B' && s[x-2] == 'A')){
            cnt ++;
        }
        s[x] = c;
    };

    while(q--){
        int x = read() - 1;
        char c; cin>>c;
        if(s[x] == c){
            cout<<cnt<<endl;
            continue;
        }
        del(x);
        add(x, c);
        cout<<cnt<<endl;
        //cout<<s<<endl;
    }
}

D - Buildings

题意:

给定 \(N\) 个建筑,依次求当 \(i = 1,2,...N\) 的时候 符合以下条件的 \(j\) 的个数
- \(i\) 和 \(j\) 之间没有比\(j\)更高的建筑物

思路:

- 考虑到 \(i\) 从1到N在不断删减元素比较复杂,就从后往前处理,每次增加一个元素
- 维护一个递增的序列,每次新增元素就把新元素前面的元素(比该元素小的元素)都删除,因为新的元素比这些元素考前而比他们大,必定不能符合条件(类似于优先队列的思想)该序列的大小就是每次符合条件的个数

  • 具体用 \(set\) 容器来实现,每次新增元素就 lower_bound 找到该元素在递增序列的位置,并用迭代器将查到的位置前面的元素全部删除,时间复杂度 \(O(nlongn)\)
void solve()
{
    int n = read();
    vector<int> v;
    for(int i=0;i<n;++i) v.emplace_back(read());
    
    set<int> st;
    vector<int> ans(n);
    ans[n-1] = 0;
    for(int i=n-1;i>0;i--){
        auto it = st.lower_bound(v[i]);
        if(it != st.end() && it != st.begin()){
            it--;
            while(it != st.begin()){
                it--;
                st.erase(next(it));
            }
            st.erase(it);
        }else if(it == st.end()){
            st.clear();
        }
        st.insert(v[i]);
        ans[i-1] = st.size()
    }
    for(auto it:ans) write(it); ED;
}

标签:AtCoder,Beginner,int,元素,st,--,补题,&&,ans
From: https://www.cnblogs.com/klri/p/18426410

相关文章

  • AtCoder Beginner Contest 372(A - F)
    A:直接输出。B:把\(M\)三进制拆分,最多10位,每位最多为2,\(N\le20\)足够了。C:暴力修改,每次只产生\(O(1)\)影响。D:预处理st表,二分每个\(j\)会断哪些\(i\)产生贡献,差分一下。E:启发式合并平衡树,\(k\)更大也能做。F:只保留有特殊边经过的点,把\(i,j\)之间的\(j-i......
  • Atcoder Beginner Contest 372
    AtcoderBeginnerContest372A模拟即可。#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){charch;while(cin>>ch){if(ch!='.'){cout<<ch;}}}......
  • AtCoder Beginner Contest 372
    省流版A.暴力即可B.转换3进制即可C.考虑答案的组成,仅修改发生变化的部分即可D.维护答案数组\(ans_i\),考虑枚举\(j\)对哪些\(i\)有贡献,通过单调栈找到对应的区间\(i\),通过差分维护区间加法即可E.并查集维护连通块,\(set\)维护点标号大小,合并\(set\)时启发式合并,查询......
  • UNIQUE VISION Programming Contest 2024 Autumn (AtCoder Beginner Contest 372)
    总结(我的塘人局):单调栈是忘得差不多了 A-delete.题意:输出删除所有'.'的字符串思路:遍历输出不是'.'复杂度:O(n) Code:#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;usingi64=int64_t;voidsolve(){strings;cin......
  • [atcoder agc 004 c] AND Grid
    题目链接题目简述给定一个H×WH\timesWH×W的网格图,有些位置已经被涂色。要求构造两个相同大小的网格图......
  • AtCoder Beginner Contest 371
    A-Jiro输入\(AB,BC,AC\)的大小关系,输出中位数。手动模拟一下。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglongintread(){intx=0;boolf=false;charc=getchar();while(c<'......
  • Codeforces Round 972 (Div. 2) 补题记录(A~C,E1)
    dproundagainA发现构造若干个\(a\)然后接若干个\(e\)接若干个\(i\)接若干个\(o\)再接若干个\(u\)且让这些字母的出现次数尽量相等最优。直接构造时间复杂度为\(O(n)\)。voidsolve(unsigned__testid=1){intn;cin>>n;F(i,0,4){intcnt=n......
  • AtCoder Beginner Contest 371
    A-Jiro(abc371A)题目大意三个人,给定他们相互之间的大小关系。问谁在中间。解题思路排个序,大小结果就是题目给的,因为问的是中间是谁,所以写的时候并没在意是升序排还是降序排。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmai......
  • AtCoder Beginner Contest 371
    ABC371总结AtCoderBeginnerContest371一些废话想着以后换一种方式写总结,不再以那种题解形式,写起来又累又难写,只对其中部分有意思的题目写出完整的题解。就是以随笔的形式,在打完比赛后写出自己的一些感悟,每道题做的过程中的一些思路、用时和需要改进的地方,就是类似随笔之类的......
  • AtCoder Beginner Contest 371
    https://atcoder.jp/contests/abc371C:暴力。思路是把1-8的点映射到全排列上面,然后把有的点去掉没的点加上取ans最小值。这题复杂度是\(8!\times7\times4\),暴力求全排列即可(第一次写暴力全排列思索了一会复杂度#include<bits/stdc++.h>usingnamespacestd;#definepiipai......