AtCoder Beginner Contest 174 我的題解(ABC水題,D思惟,E題經典二分,F離線樹狀數組)

作完本期之後,最近就不會再發布 AtCoder 的往屆比賽了(備戰藍橋杯ing)ios

補題連接:Herec++

ABC題都是水題,這裏直接跳過數組

D - Alter Altar

題意:一個R-W串,能夠進行兩種操做:1. 交換任意兩個字符,2. 改變任意一個字符。問最少操做幾回,能夠使得串中不包含WR學習

思路:this

能夠發現,使用操做 \(1\) 總不劣於操做 \(2\) 的 。最終須要把串變爲R...RW...W的形式,因此先統計R的個數 \(r\) ,而後統計前 \(r\) 個字符中R的個數 \(r′\) ,最後的結果就是 \(\Delta r=r-r'\)spa

int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    int n; string s;
    cin >> n >> s;
    int r = 0, rr = 0;
    for (int i = 0; i < s.size(); ++i)
        if (s[i] == 'R') r++;
    for (int i = 0; i < r; ++i)
        if (s[i] == 'R') rr++;
    cout << r - rr;
    return 0;
}

E - Logs

\(N\) 根木條,每條長爲 \(L_i\) ,最多鋸 \(K\) 次 ,問鋸完後最長的木條最短有多長(結果進位爲整數)。code

思路:經典二分。二分查找最後的答案,判斷所須要的次數是否超過 \(K\) 次。排序

// Murabito-B 21/04/09
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    int n, k;
    cin >> n >> k;
    vector<ll> a(n);
    for (ll &x : a) cin >> x;
    ll l = 1, r = *max_element(a.begin(), a.end());
    while (l <= r) {
        ll mid = l + (r - l) / 2;
        ll ans = 0;
        for (ll i : a) ans += (i - 1) / mid;
        if (ans > k) l = mid + 1;
        else
            r = mid - 1;
    }
    cout << l;
    return 0;
}

F - Range Set Query

給定數組 \(A\),進行 \(Q\)次 詢問,每次須要回答 \([L_i,R_i]\)區間內不一樣數字的個數。ci

思路:element

經典樹狀數組解法,離線作法是按查詢區間右端點排序而後依次處理,過程當中用樹狀數組記錄和更新當前狀態。同一個數字,只有最後一次出現是有效的。

代碼學習自 CP wiki

// Murabito-B 21/04/09
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
// 樹狀數組類
template <class T>
class FenwickTree {
    int limit;
    vector<T> arr;

    T lowbit(T x) { return x & (-x); }

public:
    FenwickTree(int limit) {
        this->limit = limit;
        arr         = vector<T>(limit + 1);
    }

    void update(int idx, T val) {
        for (; idx <= limit; idx += lowbit(idx)) arr[idx] += val;
    }

    T query(int idx) {
        T ans = 0;
        for (; idx > 0; idx -= lowbit(idx)) ans += arr[idx];
        return ans;
    }
};

int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    int n, q;
    cin >> n >> q;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; ++i) cin >> a[i];
    vector<pair<int, int>> Q;
    for (int i = 0, l, r; i < q; ++i) {
        cin >> l >> r;
        Q.push_back({l, r});
    }
    vector<int> order(q);
    for (int i = 0; i < q; ++i) order[i] = i;
    sort(order.begin(), order.end(), [&](int i, int j) { return Q[i].second < Q[j].second; });
    vector<int> ans(q), pos(n + 1);
    int lst = 0;
    FenwickTree<int> ft(n);
    for (int i = 0; i < q; ++i) {
        int k = order[i];
        int l = Q[k].first, r = Q[k].second;
        for (int j = lst + 1; j <= r; ++j) {
            if (pos[a[j]] != 0)
                ft.update(pos[a[j]], -1);
            ft.update(j, 1);
            pos[a[j]] = j;
        }
        ans[k] = ft.query(r) - ft.query(l - 1);
        lst    = r;
    }
    for (int i : ans) cout << i << "\n";
    return 0;
}
相關文章
相關標籤/搜索