藍橋杯第9場小白入門賽

涤生yang發表於2024-04-07

第三題:字元遷移
題意:給你一個區間,把這個區間裡的所有字元都++,字母a變成b,z變成a (這樣的操作有多次,多次for迴圈肯定是過不去的)
思路:
1、思路1:就是多個for迴圈暴力,只能過66.7%(打藍橋杯也夠了)
2、思路2:看了一下csdn,這就是一個非常非常板的不能再板的差分問題(真實藍橋的出題風格。。。還是有板子)
講講差分和字首和:

具體實現:
有這樣一個陣列:這個陣列記錄了每個位置的字元需要++的次數。那麼我們考慮能不能把這個陣列當成一個字首和陣列呢?
每個位置都是由前面的數字加和得來的(這就是字首和的思想)
剛好這個題就是這樣,從起點開始,後面一段長度內都是受第一個影響的。而最後一個後面那個不受影響。

#include<bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;

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

    int n, T;
    cin >> n >> T;
    string a;
    cin >> a;

    vector<int> diff(n + 1, 0);  // 差分陣列,初始值為 0

    while (T--)
    {
        int l, r, k;
        cin >> l >> r >> k;

        // 在差分陣列中更新操作範圍的兩個端點
        diff[l - 1] += k;
        diff[r] -= k;
    }

    // 根據差分陣列計算字元的偏移量
    for (int i = 1; i < n; i++)
    {
        diff[i] += diff[i - 1];
    }

    // 修改字元
    for (int i = 0; i < n; i++)
    {
        a[i] = (a[i] - 'a' + diff[i]) % 26 + 'a';
    }

    cout << a;

    return 0;
}

相關文章