AtCoder Beginner Contest 357

AtCoder Beginner Contest 357

A:模拟即可:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1e5 + 10;
const int mod = 1e7 + 9;
#define rep(i,a,b) for(int i=a;i<b;i++)

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll n,sum;
    cin>>n>>sum;
    vector<ll>a(n+1);
    ll ans;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(sum-a[i]<0)
        {
            ans=i-1;
            break;
        }
        sum-=a[i];
        ans=i;
    }
    cout<<ans;
    return 0;
}

B:分别统计大小写字符个数(tolower函数转为小写,totoupper转为大写)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1e5 + 10;
const int mod = 1e7 + 9;
#define rep(i,a,b) for(int i=a;i<b;i++)

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    string s;
    cin>>s;
    ll n=s.size();
    ll x=0,y=0;
    rep(i,0,n){
        if(s[i]>='a'&&s[i]<='z')
        {
         x++;
        }
        else{
        y++;
        }
    }
    if (x > y) {
        for (char& c : s) {
            c = tolower(c);
        }
    } else {
        for (char& c : s) {
            c = toupper(c);
        }
    }
    cout<<s;
    return 0;
}

C:模拟题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1e5 + 10;
const int mod = 1e7 + 9;
#define rep(i, a, b) for (int i = a; i < b; i++)

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, l = 1;
    char a[729][730];
    for (int i = 0; i < 729; i++)
        for (int j = 0; j < 730; j++)
            a[i][j] = 0;

    cin >> n;
    a[0][0] = '#';
    for (int k = 0; k < n; k++)
    {
        for (int x = 0; x < 3; x++)
        {
            for (int y = 0; y < 3; y++)
            {
                if ((x == 0) && (y == 0))
                    continue;
                if ((x == 1) && (y == 1))
                {
                    for (int i = 0; i < l; i++)
                        for (int j = 0; j < l; j++)
                            a[x * l + i][y * l + j] = '.';
                }
                else
                {
                    for (int i = 0; i < l; i++)
                    {
                        for (int j = 0; j < l; j++)
                        {
                            a[x * l + i][y * l + j] = a[i][j];
                        }
                    }
                }
            }
        }
        l *= 3;
    }

    for (int i = 0; i < l; i++)
        cout << a[i] << endl;

    return 0;

    return 0;
}

D:我们通过题目可以发现将数字n重复连接n次就是相当于一个等比数列求和,如n=5即5+50+500+5000+50000=55555;

等比数列求和公式

\[S_n = a_1\cdot \frac{1 - q^n}{1 - q} \quad (q \neq 1) \]

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 998244353;

ll p(ll x, ll k) {//快速幂
    ll r = 1;
    while (k) {
        if (k & 1) r = r * x % MOD;
        x = x * x % MOD;
        k >>= 1;
    }
    return r;
}

signed main() {
    ll n;
    cin >> n;
    
    ll l = to_string(n).length();  //数字的长度,
    ll pl = p(10, l);//公比             
    ll pln = p(pl, n);//q^n           
    
    ll u = (pln - 1 + MOD) % MOD; 
    ll d = (pl - 1 + MOD) % MOD;  
    ll invd = p(d, MOD - 2);//分母的逆元     
    
    cout << n % MOD * u % MOD * invd % MOD << endl;
    
    return 0;
}

E:图论,不熟

F:使用线段树模板即可:

#include<bits/stdc++.h>

typedef long long LL;
using namespace std;
const int N = 2e5 + 10;
const int MOD = 998244353;

class segment {
#define lson (root << 1)
#define rson (root << 1 | 1)
public:
    LL sab[N << 2];
    LL sum[N << 2][2];
    LL lazy[N << 2][2];

    void pushup(int root) {
        sab[root] = (sab[lson] + sab[rson]) % MOD;
        sum[root][0] = (sum[lson][0] + sum[rson][0]) % MOD;
        sum[root][1] = (sum[lson][1] + sum[rson][1]) % MOD;
    }

    void build(int root, int l, int r, vector<int> &a, vector<int> &b) {
        if (l == r) {
            sab[root] = 1ll * a[l - 1] * b[l - 1] % MOD;
            sum[root][0] = a[l - 1];
            sum[root][1] = b[l - 1];
            return;
        }
        int mid = (l + r) >> 1;
        build(lson, l, mid, a, b);
        build(rson, mid + 1, r, a, b);
        pushup(root);
    }

    void pushdown(int root, int l, int mid, int r) {
        if (lazy[root][0] || lazy[root][1]) {
            sab[lson] = (sab[lson] + lazy[root][0] * sum[lson][1] % MOD + lazy[root][1] * sum[lson][0] % MOD +
                         lazy[root][0] * lazy[root][1] % MOD * (mid - l + 1) % MOD) % MOD;
            sum[lson][0] = (sum[lson][0] + lazy[root][0] * (mid - l + 1) % MOD) % MOD;
            sum[lson][1] = (sum[lson][1] + lazy[root][1] * (mid - l + 1) % MOD) % MOD;

            sab[rson] = (sab[rson] + lazy[root][0] * sum[rson][1] % MOD + lazy[root][1] * sum[rson][0] % MOD +
                         lazy[root][0] * lazy[root][1] % MOD * (r - mid) % MOD) % MOD;
            sum[rson][0] = (sum[rson][0] + lazy[root][0] * (r - mid) % MOD) % MOD;
            sum[rson][1] = (sum[rson][1] + lazy[root][1] * (r - mid) % MOD) % MOD;

            lazy[lson][0] = (lazy[lson][0] + lazy[root][0]) % MOD;
            lazy[lson][1] = (lazy[lson][1] + lazy[root][1]) % MOD;
            lazy[rson][0] = (lazy[rson][0] + lazy[root][0]) % MOD;
            lazy[rson][1] = (lazy[rson][1] + lazy[root][1]) % MOD;

            lazy[root][0] = lazy[root][1] = 0;
        }
    }

    void update(int root, int l, int r, int L, int R, LL val, int op) {
        if (L <= l && r <= R) {
            sab[root] = (sab[root] + val * sum[root][op ^ 1] % MOD) % MOD;
            sum[root][op] = (sum[root][op] + val * (r - l + 1) % MOD) % MOD;
            lazy[root][op] = (lazy[root][op] + val) % MOD;
            return;
        }
        int mid = (l + r) >> 1;
        pushdown(root, l, mid, r);
        if (L <= mid)
            update(lson, l, mid, L, R, val, op);
        if (R > mid)
            update(rson, mid + 1, r, L, R, val, op);
        pushup(root);
    }

    LL query(int root, int l, int r, int L, int R) {
        if (L <= l && r <= R) {
            return sab[root];
        }
        int mid = (l + r) >> 1;
        pushdown(root, l, mid, r);
        LL ans = 0;
        if (L <= mid)
            ans += query(lson, l, mid, L, R);
        if (R > mid)
            ans += query(rson, mid + 1, r, L, R);
        ans %= MOD;
        return ans;
    }

} sg;

int main() {
    int n, q;
    cin >> n >> q;
    vector<int> a(n), b(n);
    for (auto &i: a)
        cin >> i;
    for (auto &i: b)
        cin >> i;
    sg.build(1, 1, n, a, b);
    while (q--) {
        int op;
        cin >> op;
        if (op == 3) {
            int l, r;
            cin >> l >> r;
            int ans = sg.query(1, 1, n, l, r);
            cout << ans << endl;
        } else {
            int l, r, x;
            cin >> l >> r >> x;
            sg.update(1, 1, n, l, r, x, op - 1);
        }
    }
    return 0;
}

posted @ 2025-05-14 21:08  cloudbless  阅读(16)  评论(0)    收藏  举报