【每日一题】补档 CF371 D. Vessels | 并查集 | 简单

题目内容

原题链接

从上到下有 n n n 个碗,每个碗中水满了之后会往下一个碗流,最后一个碗水满了后会直接流出去。

现在有两种操作:

  • 1 i x 表示往第 i i i 个碗里加 x x x 的水
  • 2 i 表示查询第 i i i 个碗里现在的水量

给定你 m m m 次操作,每次操作是上面两种之一,当面临第二种操作时,请输出第 i i i 个碗里现在的水量。

数据范围

  • 1 ≤ n , m ≤ 2 ⋅ 1 0 5 1\leq n,m\leq 2\cdot 10^5 1≤n,m≤2⋅105
  • 1 ≤ i ≤ n 1\leq i\leq n 1≤i≤n
  • 1 ≤ x ≤ 1 0 9 1\leq x\leq 10^9 1≤x≤109

题解

复杂在于如果当前加入水的第 i i i 个碗及其之后的若干个碗都是满的,如何快速找到第一个没满的碗 j j j,水必然是流向 j j j 的。

并查集维护当前碗 i i i 指向的第一个没满的碗 j j j 即可。

时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)

代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int MAXBIT = 30;
const int MOD = 1e9 + 7;

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

    int n;
    cin >> n;

    vector<int> a(n);
    vector<int> cur(n);
    for (int i = 0; i < n; ++i) cin >> a[i];

    vector<int> p(n + 1);
    iota(p.begin(), p.end(), 0);

    auto find = [&](int x) {
        int root = x;
        while (root != p[root]) root = p[root];
        while (x != p[x]) {
            int nx = p[x];
            p[x] = root;
            x = nx;
        }
        return root;
    };

    int m;
    cin >> m;

    while (m--) {
        int op, idx, x;
        cin >> op >> idx;
        idx--;

        int fa = find(idx);

        if (op == 1) {
            cin >> x;
            if (fa == n) continue;
            int l = fa;
            while (x > 0 && l < n) {
                int need = min(x, a[l] - cur[l]);
                cur[l] += need;
                x -= need;
                if (cur[l] == a[l]) l += 1;
            }
            for (int i = fa; i < l; ++i) p[find(i)] = find(l);
        } else {
            cout << cur[idx] << "\n";
        }
    }

    return 0;
}
相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法