蓝桥周赛题目分享

1. 四个亲戚

在字符串 后加上 即可,答案输出 。

#include 
 using namespace std;
 typedef long long ll;
 int main() {
 cout << "Daiyu'kind'" << '\n';
 return 0;
 }

2. 黛玉泡茶

解题思路 至少斟满 杯茶,为了让林黛玉尽可能的少跑几趟,我们贪心的选择容量最小的杯茶,之后算出杯茶的总容积

#include 
 using namespace std;
 typedef long long ll;
 int main() {
 int n, m, k;
 cin >> n >> m >> k;
 vector a(n);
 for (int i = 0; i < n; ++i) {
 cin >> a[i];
 }
 sort(a.begin(), a.end());
 ll s = 0;
 for (int i = 0; i < k; ++i) {
 s += a[i];
 }
     ll ans = (s - 1) / m + 1;
    cout << ans << endl;
    return 0;
 }

3. 宝玉请安

 #include
 using namespace std;
 void solve() {
    int x1, x2, x3;
    cin >> x1 >> x2 >> x3;
    if (x1 <= x2 && x1 <= x3) {
        cout << max(x2, x3) - x1 << endl;
    } else if (x1 >= x2 && x1 >= x3) {
        cout << x1 - min(x2, x3) << endl;
    } else {
        int y1 = abs(x1 - x2);
        int y2 = abs(x1 - x3);
        if (y1 > y2) {
            swap(y1, y2);
        }
        cout << y1 * 2 + y2 << endl;
    }
 }
 int main() {
    int t;
    cin >> t;
    for (int i = 0; i < t; ++i) {
        solve();
    }
    return 0;
 }

4. 贾母祝寿

因为我们只关心所有元素的绝对值的最大值,所以我们只需要考虑最终数组的最大值和最小值。对于每 个增量查询,第一个元素会受到影响;而对于每个减量查询,最后一个元素会受到影响。因此,第一个 元素将成为最大值,最后一个元素将成为最小值。 最后,我们只需考虑每个查询对第一个和最后一个元素的影响。需要注意的是,有一个特殊的查询会影 响数组中的所有元素,即 。 时间复杂度为 O(N)。

 #include 
 using namespace std;
 typedef long long ll;
 void solve() {
    int n, q;
    cin >> n >> q;
    ll a = 0, b = 0;
    for (int i = 0; i < q; ++i) {
        int t, x, y;
        cin >> t >> x >> y;
        if (t == 1) {
            a += y;
            if (x == n) {
                b += y;
            }
        } else {
            b -= y;
            if (x == n) {
                a -= y;
            }
        }
    }
    cout << max(abs(a), abs(b)) << '\n';
 }
 int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int t = 1;
    while (t--) {
        solve();
    }
    return 0;
 }

5. 清洁客房

 #include
 #define F(i, a, b) for(int i = a ; i <= b ; i ++)
 #define int long long
 using namespace std;
 const int MAXN = 1E5 + 10, MOD = 1E9 + 7;
 int dp[MAXN][4];
 signed main() {
 std::ios::sync_with_stdio(false);
 std::cin.tie(nullptr);
 }
 dp[1][1] = 9;
 F (i, 2, 100000) {
 dp[i][1] = dp[i - 1][1];
 dp[i][2] = (dp[i - 1][1] * 9 % MOD + dp[i - 1][2] * 2 % MOD) % MOD;
 dp[i][3] = (dp[i - 1][2] * 8 % MOD + dp[i - 1][3] * 3 % MOD) % MOD;
 }
 int t; cin >> t;
 while (t --) {
 int n; cin >> n;
 cout << dp[n][3] << '\n';
 }
 return 0;

6. 宝玉与黛玉的考验

 #include 
 using namespace std;
 typedef long long ll;
 void solve() {
 int n, m, k;
 cin >> n >> m >> k;
 string s, t;
 cin >> s >> t;
 vector a(n), b(m);
 for (int i = 0; i < n; ++i) {
 a[i] = s[i] - '0';
 }
 for (int i = 0; i < m; ++i) {
 b[i] = t[i] - '0';
 }
 ll c = 0;
 ll mx = -1e9, mi = 1e9;
 for (int i = 0; i < n; ++i) {
 c += (a[i] == 0);
 if (i - k >= 0) {
 c -= (a[i - k] == 0);
 }
 if (i >= k - 1) {
 mx = max(c, mx);
 mi = min(c, mi);
 }
 }
 ll tg = 0, ans = 0;
for (int i = 0; i < m; ++i) {
        tg += (b[i] == 0);
        if (i - k >= 0) {
            tg -= (b[i - k] == 0);
        }
        if (i >= k - 1) {
            if (2 * tg > k) {
                ans = max(ans, 1LL * k * tg + 1LL * mi * (k - 2 * tg));
            } else {
                ans = max(ans, 1LL * k * tg + 1LL * mx * (k - 2 * tg));
            }
        }
    }
    cout << ans << '\n';
 }
 int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int t = 1;
    while (t--) {
        solve();
    }
    return 0;
 }

7.小鸡变鸡腿

 #include
 #define F(i, a, b) for(int i = a ; i <= b ; i ++)
 #define int long long
 using namespace std;
 const int UP = 1E18;
 int calc(int n) {
 int res = 1, x = n;
 for (int i = 2; i * i <= n; i ++) {
 if (n % i == 0) {
 int cnt = 0;
 while (n % i == 0) {
 n /= i;
 cnt ++ ;
 }
 if (UP / (cnt * x + 1) <= res) return UP; 
res = res * (cnt * x + 1);
 }
 }
 if (n > 1) {
 if (UP / (x + 1) <= res) return UP;
 res = res * (x + 1);
 }
 return res;
 }
 signed main() {
 std::ios::sync_with_stdio(false);
 std::cin.tie(nullptr);
 sets;
 mapmp;
 int MA = -1;
 F (i, 1, 30030) { 
int cnt = calc(i);
 if (cnt > MA) {
 MA = cnt; s.insert(cnt);
 mp[cnt] = i;
 }
 }
int t; cin >> t;
 while (t --) {
 int K; cin >> K;
 auto n = s.lower_bound(K);
 cout << mp[*n] << '\n';    
}
 return 0;
 }

8.赏花宴

 #include 
 #define int long long
 using namespace std;
 const int N = 1e5 + 10;
 struct node{
 int k, id, ans;
 bool operator < (const node &x) const {
 
        if (k == x.k) return id < x.id;
        return k < x.k;
    }
 }Q[N];
 bool cmp(node a, node b) {
    return a.id < b.id;
 }
 int n, q, a[N];
 signed main() {
    cin >> n >> q;
    for (int i = 1 ; i <= n ; i ++) cin >> a[i];
    for (int i = 1 ; i <= q ; i ++) {
        cin >> Q[i].k;
        Q[i].id = i; // 记录原始询问顺序
    }
    sort(a + 1 , a + 1 + n); // 对已有的头饰编号排序
    sort(Q + 1, Q + 1 + q); // 对询问按照 k 值排序
    int pre = 0, j = 1, sum = 0; // pre 记录上一个已有的头饰编号,j 指向当前处理的询问,
sum 记录累计的缺失编号数量
    for (int i = 1 ; i <= n ; i ++) {
        int cha = a[i] - pre - 1; // 计算当前编号与上一个编号之间的缺失数量
        if (cha < 0) continue ; // 如果 cha < 0,说明当前编号小于等于上一个编号(可能是重
复的),直接跳过
        // 如果当前缺失的数量 cha 大于等于当前询问 k,则可以直接计算出答案
        if (Q[j].k <= cha) {
            Q[j].ans = pre + Q[j].k; // 计算答案
            Q[j].k = 0; // 标记该询问已处理
            j ++; // 处理下一个询问
            i --; // 因为当前编号 a[i] 还没有处理完,所以 i--,下次循环继续处理
            //Q[j].k -= sum; // 这行代码是多余的,因为 sum 还没更新,不需要减去
            continue ;
        }
        // 如果当前缺失的数量 cha 小于当前询问 k,则更新 k 和 sum
        Q[j].k -= cha; // 更新 k
        sum += cha; // 更新 sum
        pre = a[i]; // 更新 pre
    }
    // 处理剩余的询问,这些询问对应的丫鬟编号都大于最大的已知头饰编号
    if (Q[j].k > 0) Q[j].ans = pre + Q[j].k, j ++; // 处理第一个剩余的询问
    for (int i = j ; i <= q ; i ++) {
        Q[i].ans = pre + Q[i].k; // 处理剩余的询问。这里不需要减去 sum,因为 sum 只记录
到最后一个 a[i] 为止的缺失数量,而剩余的询问的编号都大于 a[n]
    }
    sort(Q + 1, Q + 1 + q, cmp); // 按照原始询问顺序排序
    for(int i = 1 ; i <= q ; i ++) cout << Q[i].ans << "\n";
    return 0;
 }

9.宝玉出行

 #include 
 using namespace std;
 typedef long long ll;
 template  struct LazySegmentTree {
    const int n;
    std::vector info;
    std::vector tag;
    LazySegmentTree(int n)
        : n(n), info(4 << (int)std::log2(n)), tag(4 << (int)std::log2(n)) {}
    LazySegmentTree(std::vector init) : LazySegmentTree(init.size()) {
        std::function build = [&](int p, int l, int r) {
            if (r - l == 1) {
                info[p] = init[l];
                return;
            }
            int m = (l + r) / 2;
            build(2 * p, l, m);
            build(2 * p + 1, m, r);
            pull(p);
        };
        build(1, 0, n);
    }
    void pull(int p) {
        info[p] = info[2 * p] + info[2 * p + 1];
    }
    void apply(int p, const Tag &v) {
        info[p].apply(v);
        tag[p].apply(v);
    }
    void push(int p) {
        apply(2 * p, tag[p]);
        apply(2 * p + 1, tag[p]);
        tag[p] = Tag();
    }
    void modify(int p, int l, int r, int x, const Info &v) {
        if (r - l == 1) {
            info[p] = v;
            return;
        }
        int m = (l + r) / 2;
        push(p);
        if (x < m) {
            modify(2 * p, l, m, x, v);
        } else {
            modify(2 * p + 1, m, r, x, v);
        }
        pull(p);
    }
    void modify(int p, const Info &v) {
        modify(1, 0, n, p, v);
    }
    Info rangeQuery(int p, int l, int r, int x, int y) {
        if (l >= y || r <= x) {
            return Info();
        }
        if (l >= x && r <= y) {
            return info[p];
        }
        int m = (l + r) / 2;
        push(p);
        return rangeQuery(2 * p, l, m, x, y) +
               rangeQuery(2 * p + 1, m, r, x, y);
    }
    Info rangeQuery(int l, int r) {
        return rangeQuery(1, 0, n, l, r);
    }
    void rangeApply(int p, int l, int r, int x, int y, const Tag &v) {
        if (l >= y || r <= x) {
            return;
        }
        if (l >= x && r <= y) {
            apply(p, v);
            return;
        }
        int m = (l + r) / 2;
        push(p);
        rangeApply(2 * p, l, m, x, y, v);
        rangeApply(2 * p + 1, m, r, x, y, v);
        pull(p);
    }
    void rangeApply(int l, int r, const Tag &v) {
        return rangeApply(1, 0, n, l, r, v);
    }
    template 
    int findFirst(int p, int l, int r, int x, int y, F pred) {
        if (l >= y || r <= x || !pred(info[p])) {
            return -1;
        }
        if (r - l == 1) {
            return l;
        }
        int m = (l + r) / 2;
        push(p);
        int res = findFirst(2 * p, l, m, x, y, pred);
        if (res == -1) {
            res = findFirst(2 * p + 1, m, r, x, y, pred);
        }
        return res;
    }
    template  int findFirst(int l, int r, F pred) {
        return findFirst(1, 0, n, l, r, pred);
    }
 };
 struct Tag {
    ll add;
    Tag(int _rev = 0) : add{_rev} {}
    void apply(const Tag &t) {
        add += t.add;
    }
 };
 struct Info {
    int len;
    long long sum;
    long long mx;
    Info() : len(1), sum(0), mx(0) {}
    Info(long long v, int x) : len(x), sum(v), mx(v) {}
    void apply(const Tag &t) {
        sum += t.add * len;
        mx += t.add;
    }
 };
 Info operator+(const Info &a, const Info &b) {
    Info c;
    c.len = a.len + b.len;
    c.sum = a.sum + b.sum;
    c.mx = max(a.mx, b.mx);
    return c;
 }
 void solve() {
    int n, d;
    cin >> n >> d;
    string s;
    cin >> s;
    vector init(n);
    int c = 0;
    for (int i = 0; i < n; ++i) {
        c += (s[i] == '1');
        if (i >= d) {
            c -= (s[i - d] == '1');
        }
        init[i] = {c, 1};
    }
    LazySegmentTree seg(init);
    int q;
    cin >> q;
    while (q--) {
        int op, x;
        cin >> op >> x;
        if (op == 1) {
            x--;
            if (s[x] == '1') {
                int r = min(x + d - 1, n - 1);
                seg.rangeApply(x, r + 1, -1);
                s[x] = '0';
            } else {
                int r = min(x + d - 1, n - 1);
                seg.rangeApply(x, r + 1, 1);
                s[x] = '1';
            }
        } else {
            int mx = seg.rangeQuery(0, n).mx;
            if (mx <= x) {
                cout << -1 << '\n';
                continue;
            }
            auto pred = [&](const Info &node) {
                return node.mx > x;
            };
            int j = seg.findFirst(0, n, pred);
            cout << j + 1 << '\n';
        }
    }
 }
 int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    cout << setiosflags(ios::fixed) << setprecision(10);
    int t = 1;
    while (t--) {
        solve();
    }
    return 0;
 }

你可能感兴趣的:(算法,c++,蓝桥杯)