zoukankan      html  css  js  c++  java
  • POJ

    题意:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格。商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润。

    思路:路径压缩,得到每个点到当前根的信息,然后更新即可。 有可以用倍增做。

    很久前抄的代码。

    #include<cstdio>
    #define min(a,b) (a<b?a:b)
    #define max(a,b) (a>b?a:b)
    #define swap(a,b) (a^=b,b^=a,a^=b)
    using namespace std;
    const int mm=333333;
    const int mn=55555;
    int s[mm],t[mm],d[mm],p[mm],ans[mm];
    int h[mn]={0},q[mn]={0},g[mn]={0},f[mn],mx[mn],mi[mn],up[mn]={0},dw[mn]={0};
    bool vis[mn]={0};
    int i,j,k,n,m,e;
    inline void add(int u,int v,int c,int h[])
    {
        s[e]=u,t[e]=v,d[e]=c,p[e]=h[u],h[u]=e++;
        s[e]=v,t[e]=u,d[e]=-c,p[e]=h[v],h[v]=e++;
    }
    int find(int x)
    {
        if(f[x]==x)return x;
        int y=f[x];
        f[x]=find(f[x]);
        up[x]=max(mx[y]-mi[x],max(up[x],up[y]));
        dw[x]=max(mx[x]-mi[y],max(dw[x],dw[y]));
        mx[x]=max(mx[x],mx[y]);
        mi[x]=min(mi[x],mi[y]);
        return f[x];
    }
    void tarjan(int u)
    {
        int i,v,x,y;
        vis[f[u]=u]=1;
        for(i=q[u];i;i=p[i])
            if(vis[v=t[i]])
                v=find(v),t[e]=i,p[e]=g[v],g[v]=e++;
        for(i=h[u];i;i=p[i])
            if(!vis[v=t[i]])tarjan(v),f[v]=u;
        for(i=g[u];i;i=p[i])
        {
            v=t[i],x=s[v],y=t[v],find(x);
            if(d[v]<0)swap(x,y),v=-d[v];
            else v=d[v];
            ans[v]=max(mx[y]-mi[x],max(up[x],dw[y]));
        }
    }
    inline void get(int &a)
    {
        char c;
        while((c=getchar())<'0'||c>'9');
        for(a=0;c>='0'&&c<='9';c=getchar())a=a*10+c-'0';
    }
    void out(int x)
    {
        if(x>9)out(x/10);
        putchar(x%10+'0');
    }
    int main()
    {
        for(get(n),i=1; i<=n; ++i)get(mx[i]),mi[i]=mx[i];
        for(e=k=1; k<n; ++k)get(i),get(j),add(i,j,0,h);
        for(get(m),k=1; k<=m; ++k)get(i),get(j),add(i,j,k,q);
        tarjan(1);
        for(i=1; i<=m; ++i)out(ans[i]),puts("");
        return 0;
    }
  • 相关阅读:
    poj 1860 Currency Exchange(最短路径的应用)
    poj 2965 The Pilots Brothers' refrigerator
    zoj 1827 the game of 31 (有限制的博弈论)
    poj 3295 Tautology (构造法)
    poj 1753 Flip Game(枚举)
    poj 2109 (贪心)
    poj 1328(贪心)
    Qt 对单个控件美化
    Qt 4基础
    Bash Shell
  • 原文地址:https://www.cnblogs.com/hua-dong/p/11237141.html
Copyright © 2011-2022 走看看