• 【bzoj1202】[HNOI2005]狡猾的商人 带权并查集


    题目描述

    刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的。账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), 。当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai 元。所谓一段时间内的总收入,就是这段时间内每个月的收入额的总和。 刁姹的任务是秘密进行的,为了调查商人的账本,她只好跑到商人那里打工。她趁商人不在时去偷看账本,可是她无法将账本偷出来,每次偷看账本时她都只能看某段时间内账本上记录的收入情况,并且她只能记住这段时间内的总收入。 现在,刁姹总共偷看了m次账本,当然也就记住了m段时间内的总收入,你的任务是根据记住的这些信息来判断账本是不是假的。

    输入

    第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断。每组数据的第一行为两个正整数n和m,其中n < 100,m < 1000,分别表示对应的账本记录了多少个月的收入情况以及偷看了多少次账本。接下来的m行表示刁姹偷看m次账本后记住的m条信息,每条信息占一行,有三个整数s,t和v,表示从第s个月到第t个月(包含第t个月)的总收入为v,这里假设s总是小于等于t。

    输出

    包含w行,每行是true或false,其中第i行为true当且仅当第i组数据,即第i个账本不是假的;第i行为false当且仅当第i组数据,即第i个账本是假的。

    样例输入

    2
    3 3
    1 2 10
    1 3 -5
    3 3 -15
    5 3
    1 5 100
    3 5 50
    1 2 51

    样例输出

    true
    false


    题解

    带权并查集

    注意题目中所给的是闭区间,在处理时应变成半开半闭的,将左端点-1或将右端点+1,赋初值时也要注意范围,以便区间合并的处理。

    r[x]表示x到f[x]的半开半闭区间中盈利或亏损的数额。

    #include <cstdio>
    int f[102] , r[102];
    int find(int x)
    {
        if(x == f[x])
            return x;
        int t = find(f[x]);
        r[x] += r[f[x]];
        f[x] = t;
        return t;
    }
    int main()
    {
        int w;
        scanf("%d" , &w);
        while(w -- )
        {
            int n , m , i , x , y , z , tx , ty , flag = 1;
            scanf("%d%d" , &n , &m);
            for(i = 1 ; i <= n + 1 ; i ++ )
                f[i] = i , r[i] = 0;
            while(m -- )
            {
                scanf("%d%d%d" , &x , &y , &z);
                y ++ ;
                tx = find(x) , ty = find(y);
                if(tx != ty)
                {
                    f[tx] = ty;
                    r[tx] = z + r[y] - r[x];
                }
                else if(r[x] - r[y] != z)
                    flag = 0;
            }
            printf("%s
    " , flag ? "true" : "false");
        }
        return 0;
    }
  • 相关阅读:
    21.Merge Two Sorted Lists 、23. Merge k Sorted Lists
    34. Find First and Last Position of Element in Sorted Array
    leetcode 20. Valid Parentheses 、32. Longest Valid Parentheses 、301. Remove Invalid Parentheses
    31. Next Permutation
    17. Letter Combinations of a Phone Number
    android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
    oc 异常处理
    oc 类型判断
    oc Delegate
    oc 协议
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6398337.html
Copyright © 2020-2023  润新知