作完本期之後,最近就不會再發布 AtCoder 的往屆比賽了(備戰藍橋杯ing)ios
補題連接:Herec++
ABC題都是水題,這裏直接跳過數組
題意:一個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; }
有 \(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; }
給定數組 \(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; }