zoukankan      html  css  js  c++  java
  • HDU 3038 并查集

    TT and FF are ... friends. Uh... very very good friends -________-b 

    FF is a bad boy, he is always wooing TT to play the following game with him. This is a very humdrum game. To begin with, TT should write down a sequence of integers-_-!!(bored). 

    Then, FF can choose a continuous subsequence from it(for example the subsequence from the third to the fifth integer inclusively). After that, FF will ask TT what the sum of the subsequence he chose is. The next, TT will answer FF's question. Then, FF can redo this process. In the end, FF must work out the entire sequence of integers. 

    Boring~~Boring~~a very very boring game!!! TT doesn't want to play with FF at all. To punish FF, she often tells FF the wrong answers on purpose. 

    The bad boy is not a fool man. FF detects some answers are incompatible. Of course, these contradictions make it difficult to calculate the sequence. 

    However, TT is a nice and lovely girl. She doesn't have the heart to be hard on FF. To save time, she guarantees that the answers are all right if there is no logical mistakes indeed. 

    What's more, if FF finds an answer to be wrong, he will ignore it when judging next answers. 

    But there will be so many questions that poor FF can't make sure whether the current answer is right or wrong in a moment. So he decides to write a program to help him with this matter. The program will receive a series of questions from FF together with the answers FF has received from TT. The aim of this program is to find how many answers are wrong. Only by ignoring the wrong answers can FF work out the entire sequence of integers. Poor FF has no time to do this job. And now he is asking for your help~(Why asking trouble for himself~~Bad boy) 

    InputLine 1: Two integers, N and M (1 <= N <= 200000, 1 <= M <= 40000). Means TT wrote N integers and FF asked her M questions. 

    Line 2..M+1: Line i+1 contains three integer: Ai, Bi and Si. Means TT answered FF that the sum from Ai to Bi is Si. It's guaranteed that 0 < Ai <= Bi <= N. 

    You can assume that any sum of subsequence is fit in 32-bit integer. 
    OutputA single line with a integer denotes how many answers are wrong.Sample Input

    10 5
    1 10 100
    7 10 28
    1 3 32
    4 6 41
    6 6 1

    Sample Output

    1


    题意:
      长度为 n 的区间,进行 m 次描述。
      每次描述一个区间元素的大小总和。
      如果之前的为真描述中没有和本次描述冲突的,那么本次描述为真。
      如果和之前的为真的描述有冲突,那么本次描述为假。
      求假描述的数量。

    使用并查集,记录当前点所能到的最远左端点。
    另外一个val数组记录当前点与左端点构成的区间的总和,所以需要随着并查集的更新而更新。

    先让u--;
    这样u就是与当前区间相邻的区间的右端点。.
    注意:在下面的描述中 u 是 -1 操作后的新点

    首先判断u和v是否同根,同根就判断真假,设相同的根为 root, 那么[root,v]与[root,u]+[u+1,v]指的是一个区间
    在判断val[v] 是否等于 val[u]+w 就得到了描述的真假性

    不同根就没法判断为假,即为真,更新并查集。
    更新要根据 u 和 v 的根节点的相对位置来决定将那一颗树合并到另一颗中。
    同样val的更新也要根据根节点相对位置来计算。
    手动画图模拟可以帮助推出表达式。

    #include<cstdio>
    
    int pre[200005];
    int val[200005];
    
    int find_(int x){
        int k = pre[x];
    
        if(k != x){
            pre[x] = find_(pre[x]);
            val[x] += val[k];
        }
        return pre[x];
    }
    int main(){
        int n, m, u, v, w, ans=0;
    
        while(scanf("%d%d",&n,&m)!=EOF){
            ans = 0;
            for(int i=0;i<=n;i++)
                pre[i] = i,val[i]=0;
            for(int i=0;i<m;i++){
                scanf("%d%d%d",&u,&v,&w);
                u --;
                int ru = find_(u);
                int rv = find_(v);
                if(ru == rv && val[u]+w != val[v]){
                    ans ++;
                }else if(ru < rv){
                    pre[rv] = ru;
                    val[rv] = val[u] + w - val[v];
                }else if(ru > rv){
                    pre[ru] = rv;
                    val[ru] = val[v] - val[u] - w;
                }
            }
            printf("%d
    ",ans);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    你知道线程池是如何退出程序的吗?
    华为云GuassDB(for Redis)发布全新版本推出:Lua脚本和SSL连接加密
    分布式消息流平台:不要只想着Kafka,还有Pulsar
    新来的前端小姐姐问:Vue路由history模式刷新页面出现404问题
    1ms的时延,10Gbps速率…5G通信技术解读
    一分钟带你了解Huawei LiteOS组件开发指南
    资深Linux 系统管理员常用的15个很好用的Cron工作示例
    C语言中动态内存分配的本质是什么?
    Python连载8datetime包函数介绍 心悦君兮君不知
    Python连载7time包的其他函数 心悦君兮君不知
  • 原文地址:https://www.cnblogs.com/kongbb/p/10502123.html
Copyright © 2011-2022 走看看