并查集-解决区间和纠错问题 hdu-3038

题目:多次给出信息,告诉你[a,b]区间的和,求多少个错误信息(错误信息不考虑)。

乍一看有点像线段树,但想想就发现这个并不能用线段树方便地解决。后来经提醒是并查集的一种经典题型。

把区间抽象为并查集的子节点和母根结点,子节点存放了到根节点的区间和。这样当引入一个新的区间,如果区间左右界根节点不同就一定不存在矛盾(有点种类并查集的意思,形象来看就是存在冗余区间用于调整),然后可以通过现存集合推导出子节点到根节点的区间和。如果根节点相同则要判断一下是否矛盾(画个图对线段加加减减就能推出公式了,文字不太好描述)。

#include <iostream>
#include <cstdio>
#define LL long long int
using namespace std;
int pre[200005];
LL val[200005];
int Find(int x)
{
    if(pre[x]==x) return x;
    int te=Find(pre[x]);
    val[x]+=val[pre[x]];
    return pre[x]=te;
}
void ini()
{
    int lx=200000;
    for(int i=0;i<=lx;i++)
        pre[i]=i,val[i]=0;
}
int main()
{
    cin.sync_with_stdio(false);
    int n,m;
    while(cin>>n>>m)
    {
        ini();
        int u,v,w,ans=0;
        for(int i=0;i<m;i++)
        {
            cin>>u>>v>>w;
            u--;
            int t[2]={Find(u),Find(v)};
            if(t[0]==t[1])
            {
                if(val[v]-val[u]!=w)
                    ans++;
            }
            else
            {
                pre[t[1]]=t[0];
                val[t[1]]=val[u]-val[v]+w;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-10-07 06:09:52

并查集-解决区间和纠错问题 hdu-3038的相关文章

经典模型——并查集解决区间/树链染色问题

蒟蒻的第一篇blog 模型背景: 已知一个长度为n的序列,开始时序列的每一个元素都没有颜色(0),现进行m次操作,第i次操作将一段区间[l,r]中还未被染色的点(即a[i]=0的点)染成颜色i.问m次操作后这个区间长什么样子,并将它输出来. 数据规模约定:对于100%的数据,n,m<=10^6 问题解决 我会nm暴力! 对于每一个操作i,暴力扫描[l,r],染色,最后输出. ※期望得分:10. 并查集!没想到吧 用并查集来维护从节点i往后的区间[i,n]中第一个0出现的位置,也就是i之后第一个还

UVA 572 油田连通块-并查集解决

题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... 1 #include <cstdio> 2 #include <iostream> 3 #include <sstream> 4 #include <cmath> 5 #include <cstring> 6 #include <cstdlib&

Knight Tournament 伪并查集(区间合并)

Knight Tournament Hooray! Berl II, the king of Berland is making a knight tournament. The king has already sent the message to all knights in the kingdom and they in turn agreed to participate in this grand event. As for you, you're just a simple pea

Restructuring Company和Almost Union-Find 并查集的区间合并与并查集的删除

Restructuring Company Even the most successful company can go through a crisis period when you have to make a hard decision - to restructure, discard and merge departments, fire employees and do other unpleasant stuff. Let's consider the following mo

最小生成树问题(并查集解决)

        传统的Prim算法或者是Kruskal算法求最小生成树时,要先把图创建出来,就比较麻烦.         如果用并查集来解决,依次选取权值最小的边,判断它们是否在一个并查集内,如果在则舍去,如果不在则加入,简单了很多. 题目描述 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. 输入

poj 1456 Supermarket(并查集维护区间)

 题意:有一些货物,每个货物有价值和卖出的截至日期,每天可以卖一个货物,问能卖出的最大价值是多少. 思路:算法不难想到,按价值降序排列,对于每一件货物,从deadline那天开始考虑,如果哪天空闲那么将货物在该天卖出. 如果直接暴力来做,复杂度为o(n*n),显然不行.可以用并查集来维护当前ddl之前空闲的最近的一天,如果父节点为0说明deadline之前没有空闲的时间,那么该货物就无法卖出. #include<cstdio> #include<cstring> #includ

hdu1875 最小生成树并查集解决---kruskal

http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17737    Accepted Submission(s): 553

3.19 Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题

[题目]: 如下的Node类是标准的二叉树节点结构: 1 public class Node{ 2 public int value; 3 public Node left; 4 public Node right; 5 6 public Node(int data){ 7 this.value = data; 8 } 9 } 再定义Query类如下: 1 public class Query{ 2 public Node o1; 3 public Node o2; 4 5 public Que

Codeforces Round #250 (Div. 1) B. The Child and Zoo(排序+并查集)(常规好题)

B. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The i-th area contains