• hdu3038 How Many Answers Are Wrong【基础种类并查集】


    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298091.html   ---by 墨染之樱花

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038

    题目描述:某个无聊的骚年给他的女友(烧!)一系列三元组x,y,c,表示序列中ax+ax+1+...+ay=c。但是其中有一些是错误的,也就是与前面的信息出现了冲突,比如给了1,2,6和3,4,5接着却给了1,4,100。找出所有错误的三元组的数量

    思路:正如一般带权并查集的方法。用par[i]记录父节点,d[i]记录与父节点的差值,如果x与y在不同的集合中则可以自由合并,如果在同一集合中那就有可能出现矛盾。判断d[y]-d[x]==c是否成立,成立的话自然只需无视,不成立的话就表明出现矛盾。注意Find路径压缩查找当中节点到根结点路径上的每一个点除了par要修改,d也要累计。另外,由于题中给的区间都是全闭的,会出现x=y的情况,为了方便起见,记录区间时变为左闭右开,即y++

    #include <iostream>
    #include <ios>
    #include <iomanip>
    #include <functional>
    #include <algorithm>
    #include <vector>
    #include <sstream>
    #include <list>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <string>
    #include <set>
    #include <map>
    #include <cstdio>
    #include <cstdlib>
    #include <cctype>
    #include <cmath>
    #include <cstring>
    #include <climits>
    using namespace std;
    #define XINF INT_MAX
    #define INF 1<<30
    #define MAXN 200000+10
    #define eps 1e-8
    #define zero(a) fabs(a)<eps
    #define sqr(a) ((a)*(a))
    #define MP(X,Y) make_pair(X,Y)
    #define PB(X) push_back(X)
    #define PF(X) push_front(X)
    #define REP(X,N) for(int X=0;X<N;X++)
    #define REP2(X,L,R) for(int X=L;X<=R;X++)
    #define DEP(X,R,L) for(int X=R;X>=L;X--)
    #define CLR(A,X) memset(A,X,sizeof(A))
    #define IT iterator
    #define PI  acos(-1.0)
    #define test puts("OK");
    #define _ ios_base::sync_with_stdio(0);cin.tie(0);
    typedef long long ll;
    typedef pair<int,int> PII;
    typedef priority_queue<int,vector<int>,greater<int> > PQI;
    typedef vector<PII> VII;
    typedef vector<int> VI;
    #define X first
    #define Y second
    
    int par[MAXN];
    int d[MAXN];
    int n,m;
    
    void init()
    {
        CLR(par,-1);
        CLR(d,0);
    }
    
    int find(int x)       //压缩路径查找 
    {
        int s,tot=0;
        for(s=x;par[s]>=0;s=par[s])
            tot+=d[s];
        while(s!=x)
        {
            int temp=par[x];
            par[x]=s;
            int tmp=d[x];
            d[x]=tot;
            tot-=tmp;
            x=temp;
        }
        return s;
    }
    
    int main()
    {_
        while(~scanf("%d%d",&n,&m))
        {
            init();
            int tot=0;
            REP(i,m)
            {
                int x,y,c;
                scanf("%d%d%d",&x,&y,&c);
                y++;
                int r1=find(x),r2=find(y);
                if(r1!=r2)
                {
                    par[r2]=r1;
                    d[r2]=d[x]-d[y]+c;
                }
                else
                    if(d[y]-d[x]!=c)
                        tot++;
            }
            printf("%d
    ",tot);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Web 服务编程,REST 与 SOAP
    ODI调用WebService---->OdiInvokeWebService
    Using Custom Java code in ODI
    ODI---->Variables
    Oracle---->Join
    SQLserver中用convert函数转换日期格式
    ORA-00942 表或视图不存在
    GoldenGate 12c + Oracle 12c Multitenant Container databases
    goldengate 12c 针对oracle 12c配置的主要变化
    GoldenGate 配置extract,replicat进程自启动
  • 原文地址:https://www.cnblogs.com/KirisameMarisa/p/4298091.html
Copyright © 2020-2023  润新知