首页 > 其他分享 >AtCoder Beginner Contest 158

AtCoder Beginner Contest 158

时间:2023-04-24 19:00:29浏览次数:52  
标签:AtCoder Beginner int 158 tt cin st ss ed

AtCoder Beginner Contest 158

https://atcoder.jp/contests/abc158
基础不牢,地动山摇

D - String Formation

一个小小的STL应用

#include <bits/stdc++.h>
#define ll long long

using namespace std;
string s;
int q, t, f;
char c;

int main () {
    cin >> s >> q;
    int tt = 0; //代表此刻状态
    stack <char> st;
    queue<char> ed;
    while (q --) {
        cin >> t;
        if (t == 2) {
            cin >> f >> c;
            if (f == 1) {
                if (tt == 1)    ed.push (c);
                else    st.push (c);
            }
            else {
                if (tt == 0)    ed.push (c);
                else    st.push (c);
            }
        }
        else    tt ^= 1;
    }
    string t;
    while (!st.empty ())    t += st.top (), st.pop ();
    t += s;
    while (!ed.empty ())    t += ed.front (), ed.pop ();    

    if (tt)    reverse (t.begin (), t.end ());
    cout << t;
}

E - Divisible Substring

是非常经典的数学小结论应用。
应该是利用了费马小定理,然后转化一下:

注意从右往左才是低位向高位

#include <bits/stdc++.h>
#define ll long long

using namespace std;
const int N = 2e5 + 5;
int n, p, len;
string s;
ll ans, ss;

int main () {
    cin >> n >> p >> s;
    s = ' ' + s;
    if (p == 2 || p == 5) {
        for (int i = 1; i <= n; i++) {
            if ((s[i] - '0') % p == 0)  ans += i;
        }
        cout << ans << endl;
        return 0;
    }

    map<ll, int> mp;
    mp[0] = 1; 
    ll pw = 1;
    for (int i = n; i >= 1; i--) {
        ss = ss % p + (s[i] - '0') * pw % p;
        ss %= p, pw = pw * 10 % p;
        ans += mp[ss], mp[ss] ++;
    }
    cout << ans;
}

//费马小定理: a^{p-1}=1(mod p)
//10^{p-1}=1(mod p)
//(ai*10^{p-1}+aj) mod p = (ai+aj)*10^{p-1} mod p

//转化为有多少个区间和mod p = 0
//同余即可

F - Removing Robots

神奇的dp。
\(f_i\) 表示后 \(i\) 个的方案数,然后就从后往前更新,单调栈找第一个未被影响的数。

#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> pii;
const int N = 2e5 + 5, mod = 998244353;
pii p[N];
int n, f[N]; //后i个的方案数

int main () {
    cin >> n;
    for (int i = 1; i <= n; i++)    cin >> p[i].first >> p[i].second;
    sort (p + 1, p + n + 1);
    f[n+1] = 1;
    stack <pii> s;
    for (int i = n; i >= 1; i--) {
        int nxt = i + 1, t = p[i].first + p[i].second;
        while (!s.empty () && p[s.top().first].first < t) {
            nxt = s.top ().second; //nxt是不被影响的第一个
            s.pop ();
        }
        s.push ({i, nxt});
        f[i] = (f[i+1] + f[nxt]) % mod; 
    }
    cout << f[1];
}

标签:AtCoder,Beginner,int,158,tt,cin,st,ss,ed
From: https://www.cnblogs.com/CTing/p/17350535.html

相关文章

  • AtCoder Problem Difficulty
    ABC299之前.......
  • AtCoder Regular Contest 111 F Do you like query problems?
    洛谷传送门AtCoder传送门挺有意思的计数。计数感觉很难做,不妨转成期望,期望又可以转成概率之和。考虑枚举\(w\in[0,m-1]\),把\(>w\)的数设为\(1\),\(\lew\)的数设为\(0\)。那么期望就是所有\(w\),\(a_i\)为\(1\)的概率之和。对于一个\(i\),只有以下的操作能改变\(......
  • AtCoder ABC 299 ABCDEFG
    A-TreasureChest题意给定由\(\texttt{.}\)、\(\texttt{|}\)、\(\texttt{*}\)三种字符组成的长度为\(n\)的字符串\(s\),保证\(\texttt{|}\)的个数为\(2\),\(\texttt{*}\)的个数为\(1\)。判断\(\texttt{*}\)是否在两个\(\texttt{|}\)之间。代码#include<cstrin......
  • Atcoder Beginner Contest 299 G
    对于要打印的\(B\),我们首先尝试确定\(B_1\)。让\(f(x)(1≤x≤M)\)是最大的\(i\),使\(A_i=x\)。对于\(r:=\underset{{{1≤x≤M}}}{\min}f(x)\),我们可以证明\(B_1\)是\(A_1,A_2,...,A_r\)中的一个(否则,\(B\)是\(A_{>r}:=(A_r+1,Ar+2,...,A_N)\)的一个子序列,但......
  • AtCoder Beginner Contest 283 Ex Popcount Sum
    洛谷传送门AtCoder传送门记录一下这个神奇的套路。首先有\(\operatorname{popcount}(n)=n-\sum\limits_{i=1}^{\infty}\left\lfloor\frac{n}{2^i}\right\rfloor\)。证一下:\[\operatorname{popcount}(n)=\sum\limits_{i=0}^{\infty}\left\lfloor\dfrac{n}{2^i}\right......
  • AtCoder Regular Contest 115 D Odd Degree
    洛谷传送门AtCoder传送门若连通块是一棵树,考虑钦定\(k\)个点为奇度点,方案数为\(\binom{n}{k}\)。对于叶子,如果它是奇度点,那么连向它父亲的边要保留,否则不保留。这样自底向上考虑,任意一条边的保留情况都可以唯一确定,所以最后方案数就是\(\binom{n}{k}\)。若连通块存在环,仍......
  • AtCoder Regular Contest 114 F Permutation Division
    洛谷传送门AtCoder传送门这题居然是之前某场模拟赛(contest701)的T1……(@Vidoliga场切但是被卡常/bx)下面记\(m\)为原题面中的\(K\),\(a_i\)为原题面中的\(P_i\)。不难发现后手的策略是把所有段按照段的第一个数从大到小排序接在一起。考虑若\(a_1\lem\),则先手能把所......
  • AtCoder Regular Contest 114 D Moving Pieces on Line
    洛谷传送门AtCoder传送门挺有意思的题。首先显然地,一个棋子不会走回头路。于是一个棋子沿着边走的效果就是区间异或。更进一步,设\(s_i\)为\(i-1\toi\)的边颜色与\(i\toi+1\)的边颜色是否相同(差分),相当于对于每个\(i\)都选择\(s_{a_i}\)和\(s_{x_i}\),将它们异或......
  • Atcoder Beginner Contest 298---E
    题目:E-UnfairSugoroku(atcoder.jp)分析:这题状态转移方程挺好推的,但是用dp解是我没想到的dp[i][j][0]表示T在i点,A在j点且轮到T走时赢的概率dp[i][j][1]表示T在i点,A在j点且轮到A走时赢的概率代码:#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#def......
  • AtCoder Regular Contest 109 F 1D Kingdom Builder
    洛谷传送门AtCoder传送门考虑判断一个终止态是否可达。如果只有一个棋子连续段那一定可达;否则就存在\(\ge2\)个连续段。此时把放棋子看成删除,那么限制就是如果删除一个孤立的棋子(两边没有棋子)且还有别的格子有棋子,这个棋子的颜色异于其他连续段的两边棋子的颜色。设第一......