zoukankan      html  css  js  c++  java
  • codevs 3305 水果姐逛水果街Ⅱ

    时间限制: 2 s
     空间限制: 256000 KB
     题目等级 : 钻石 Diamond
    题目描述 Description

    水果姐第二天心情也很不错,又来逛水果街。

    突然,cgh又出现了。cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径)。

    同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样。

    cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去。求最多可以赚多少钱。

    水果姐向学过oi的你求助。

    输入描述 Input Description

    第一行n,表示有n家店

    下来n个正整数,表示每家店一个苹果的价格。

    下来n-1行,每行两个整数x,y,表示第x家店和第y家店有一条边。

    下来一个整数m,表示下来有m个询问。

    下来有m行,每行两个整数x和y,表示从第x家店出发到第y家店。

    输出描述 Output Description

    有m行。

    每行对应一个询问,一个整数,表示面对cgh的每次询问,水果姐最多可以赚到多少钱。

    样例输入 Sample Input

    10
    16 5 1 15 15 1 8 9 9 15 
    1 2
    1 3
    2 4
    2 5
    2 6
    6 7
    4 8
    1 9
    1 10
    6
    9 1
    5 1
    1 7
    3 3
    1 1
    3 6

    样例输出 Sample Output

    7
    11
    7
    0
    0
    15

    数据范围及提示 Data Size & Hint

    0<=苹果的价格<=10^8

    0<n<=200000

    0<m<=10000

     
    唉真的是醉了
    考试卡fread
    倍增维护四个值
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cctype>
    #define N 205000
    
    using namespace std;
    vector<int>G[N];
    
    int max(int a,int b) {return a>b?a:b;}
    int min(int a,int b) {return a>b?b:a;}
    int ans,Minn,Maxn,V[N],n,m,dep[N],dad[N][25],Max[N][25],Min[N][25],up[N][25],down[N][25];
    void dfs(int x)
    {
        dep[x]=dep[dad[x][0]]+1;
        for(int i=0;dad[x][i];++i)
        {
            dad[x][i+1]=dad[dad[x][i]][i];
            Max[x][i+1]=max(Max[x][i],Max[dad[x][i]][i]);
            Min[x][i+1]=min(Min[x][i],Min[dad[x][i]][i]);
            up[x][i+1]=max(up[x][i],up[dad[x][i]][i]);
            up[x][i+1]=max(up[x][i+1],Max[dad[x][i]][i]-Min[x][i]);
            down[x][i+1]=max(down[x][i],down[dad[x][i]][i]);
            down[x][i+1]=max(down[x][i+1],Max[x][i]-Min[dad[x][i]][i]);
        }
        for(int i=0;i<G[x].size();++i)
        {
            int v=G[x][i];
            if(dad[x][0]==v) continue;
            dad[v][0]=x;
            Max[v][0]=max(V[x],V[v]);
            Min[v][0]=min(V[x],V[v]);
            up[v][0]=max(0,V[x]-V[v]);
            down[v][0]=max(0,V[v]-V[x]);
            dfs(v);
        }
    }
    int lca(int x,int y)
    {
        if(dep[x]>dep[y]) swap(x,y);
        for(int i=20;i>=0;--i) if(dep[dad[y][i]]>=dep[x]) y=dad[y][i];
        if(x==y) return x;
        for(int i=20;i>=0;--i) if(dad[y][i]!=dad[x][i]) x=dad[x][i],y=dad[y][i];
        return dad[x][0];
    }
    void Up(int x,int y)
    {
        for(int i=20;i>=0;--i)
        {
            if(dep[dad[x][i]]>=dep[y])
            {
                ans=max(ans,up[x][i]);
                ans=max(ans,Max[x][i]-Minn);
                Minn=min(Minn,Min[x][i]);
                x=dad[x][i];
            }
        }
    }
    void Down(int x,int y)
    {
        for(int i=20;i>=0;--i)
        {
            if(dep[dad[x][i]]>=dep[y])
            {
                ans=max(ans,down[x][i]);
                ans=max(ans,Maxn-Min[x][i]);
                Maxn=max(Maxn,Max[x][i]);
                x=dad[x][i];
            }
        }
    }
    int Main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;++i) scanf("%d",&V[i]);
        for(int x,y,i=1;i<n;++i)
        {
            scanf("%d%d",&x,&y);
            G[x].push_back(y);
            G[y].push_back(x);  
        }
        memset(Min,0x3f,sizeof(Min));
        dfs(1);
        scanf("%d",&m);
        for(int x,y;m--;)
        {
            scanf("%d%d",&x,&y);
            if(x==y) {puts("0");continue;} 
            int z=lca(x,y);
            ans=0;
            Minn=0x3f3f3f3f;
            Maxn=-0x3f3f3f3f;
            Up(x,z);
            Down(y,z);
            printf("%d
    ",max(ans,Maxn-Minn));
        }
        return 0;
    }
    int sb=Main();
    int main(int argc,char *argv[]){;}
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    跳出iframe
    leetcode 225. Implement Stack using Queues
    leetcode 206. Reverse Linked List
    leetcode 205. Isomorphic Strings
    leetcode 203. Remove Linked List Elements
    leetcode 198. House Robber
    leetcode 190. Reverse Bits
    leetcode leetcode 783. Minimum Distance Between BST Nodes
    leetcode 202. Happy Number
    leetcode 389. Find the Difference
  • 原文地址:https://www.cnblogs.com/ruojisun/p/7543024.html
Copyright © 2011-2022 走看看