首页 > 其他分享 >蓝桥杯,推导部分和

蓝桥杯,推导部分和

时间:2024-04-08 17:45:29浏览次数:20  
标签:dist 推导 int long 蓝桥 fa findSet return 部分

题意:给定若干个区间端点与区间和,还有若干个查询,求该查询的区间和。

思路:带权并查集。

总结:区间左端点-1是为了左开右闭(也可以右端点 + 1)。比如[1,2] = (0, 2] = 5,[3, 4] = (2, 4] = 6。这样就得到了[1,4] = 11(查询1可以直接得到代表元素4),处理边界情况更方便。 可以思考一下,如果不这样处理边界,查询[1,4]好像有点麻烦。

还有一个就是权重更新的方法,x, px, y, py. px -> py = input_dist - dist[x] + dist[y];
上面这个比较容易理解。

class DisjointSet{
public:
    DisjointSet(int sz): sz_(sz){
        fa_.resize(sz_);
        iota(fa_.begin(), fa_.end(), 0);
        dist_.assign(sz_, 0);
    }

    int findSet(int x){
        if (fa_[x] == x){
            return fa_[x];
        }
        int parent = fa_[x];
        fa_[x] = findSet(fa_[x]);
        dist_[x] += dist_[parent];
        return fa_[x];
    }

    bool isSameSet(int x, int y){
        return findSet(x) == findSet(y);
    }

    bool unionSet(int x, int y, long long value){
        int px = findSet(x);
        int py = findSet(y);
        if (px == py){
            return false;
        }
        fa_[px] = py;
        dist_[px] = -dist_[x] + dist_[y] + value;
        return true;
    }

    long long getDist(int x){
        findSet(x);
        return dist_[x];
    }

private:
    int sz_;
    vector<int> fa_;
    vector<long long> dist_;
};


void solve(){
    int n, m, q;
    cin >> n >> m >> q;

    DisjointSet dsu(n + 1);
    while (m --){
        int l, r;
        long long s;
        cin >> l >> r >> s;
        dsu.unionSet(l - 1, r, s);
    }


    while (q --){
        int l, r;
        cin >> l >> r;
        if (dsu.isSameSet(l - 1, r) == false){
            cout << "UNKNOWN\n";
        }
        else{
            cout << dsu.getDist(l - 1) - dsu.getDist(r) << '\n';
        }
    }
}

标签:dist,推导,int,long,蓝桥,fa,findSet,return,部分
From: https://www.cnblogs.com/yxcblogs/p/18121846

相关文章

  • 蓝桥杯2023年A组-试题D-平方差
    0.题目1.题解1.1基于中心扩展的字符串处理算法思路我们可以选定一个中心,然后从中心开始,向外扩展我们的子串,且能存储之前子串的部分性质(这里便于左等于右的情况)0.确定中心点这里我们用外层一个大循环来表示,中心点即为变量i。首先分为子串为奇数串和偶数串的情......
  • 【每周例题】蓝桥杯 C++ 对称排序
    对称排序题目对称排序 题目分析1.因为数字是对称交换,所以我们只需要判断前n/2项需不需要交换就好了2.这里我采用了升序排序,你们也可以尝试降序排序3.我们只需要排序好后再遍历一下整个数组,找出不符合排序的就输出NO就好了代码#include<iostream>#include<bits/stdc+......
  • 谢启鸿高等代数第四版习题7.7部分习题解析part2.以及部分第7章复习题
    7.7部分定理:以为特征值的K阶若当块个数为11.设n阶矩阵A的特征值全为1,求证:对任意的正整数K,与A相似。证明:=(易证故此处不再证明)而且的特征值全为1。的特征值为1的k阶若当块的个数为接下来只需证明相似于即可;即证明两者有相同的约当标准型.由书上7.8节的数学归纳可以知道......
  • (译) 理解 Elixir 中的宏 Macro, 第六部分:原地代码生成
    ElixirMacros系列文章译文[1](译)UnderstandingElixirMacros,Part1Basics[2](译)UnderstandingElixirMacros,Part2-MacroTheory[3](译)UnderstandingElixirMacros,Part3-GettingintotheAST[4](译)UnderstandingElixirMacros,Part4-Div......
  • 第十四届蓝桥杯单片机省赛
    第一部分客观题1.D2.BD3.CA时序逻辑电路是一类具有记忆功能且其输出不仅依赖于当前输入信号,还依赖于电路过去状态的数字电路。常见的时序逻辑电路包括但不限于以下几种类型:1.**触发器**:最基本的存储单元,如RS触发器、JK触发器、D触发器、T触发器等。2.**寄存器**:由多......
  • 蓝桥杯2023年A组-试题C-平方差
    0.题目1.题解1.1数学分析思路主要就是类似剪枝的思想,x必定满足某种条件,我们可以分奇偶情况进行讨论,最后在得出条件后使用暴力枚举.x=(y-z)(y+z)由于奇数±偶数=奇数,偶数±偶数=偶数,奇数±奇数=偶数;可以看出只要y,z的奇偶性质定了,则无论是加减奇......
  • (译) 理解 Elixir 中的宏 Macro, 第五部分:组装 AST
    ElixirMacros系列文章译文[1](译)UnderstandingElixirMacros,Part1Basics[2](译)UnderstandingElixirMacros,Part2-MacroTheory[3](译)UnderstandingElixirMacros,Part3-GettingintotheAST[4](译)UnderstandingElixirMacros,Part4-Div......
  • P9231 [蓝桥杯 2023 省 A] 平方差
    因式分解之后发现,满足条件的x要么是奇数,要么是4的倍数#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;......
  • 蓝桥杯
    1.题目2.题解2.1贪心+堆思路由于如下图公式所示:要获取的是最大值(最坏情况),故如果increase增量小于零则没有必要讨论(存在刚开始由于b较大使得增量大于零,而k小于0,后面由于x增大导致增量为负值)可利用贪心局部最优(每次选择加人时,均是选择增量最大的一组),实现全......
  • P9232 [蓝桥杯 2023 省 A] 更小的数
    暴力直接暴力枚举区间,并且逐个判断#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<string>#include<cmath>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)using......