(WWWWWWWWWW)codevs 3305 水果姐逛水果街Ⅱ

写这么长了不A有点舍不得。。

想A又调不出来。。

于是乎就存一下..

屠龙宝刀点击就送

#include <cstdio>
#include <vector>
#define N 205000
using namespace std;
vector<int>Graph[N];
int max(int a,int b) {return a>b?a:b;}
int min(int a,int b) {return a>b?b:a;}
int Pri[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)
    {
        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],Max[dad[x][i]][i]-Min[x][i]);
        up[x][i+1]=max(up[x][i],up[dad[x][i]][i]);
        down[x][i+1]=max(down[x][i],down[dad[x][i]][i]);
        down[x][i+1]=max(down[x][i],Max[x][i]-Min[dad[x][i]][i]);
        dad[x][i+1]=dad[dad[x][i]][i];
    }
    for(int i=0;i<Graph[x].size();++i)
    {
        int v=Graph[x][i];
        if(dad[x][0]!=v)
        {
            dad[v][0]=x;
            Max[v][0]=max(Pri[x],Pri[v]);
            Min[v][0]=min(Pri[x],Pri[v]);
            up[v][0]=max(0,Pri[x]-Pri[v]);
            down[v][0]=min(0,Pri[v]-Pri[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];
}
int Up(int x,int y)
{
    int ret=0,Minn=0x7fffffff;
    if(dep[x]>dep[y]) swap(x,y);
    for(int i=20;i>=0;--i)
    {
        if(dep[dad[y][i]]>=dep[x])
        {
            ret=max(ret,up[y][i]);
            ret=max(ret,Max[y][i]-Minn);
            Minn=min(Minn,Min[y][i]);
            y=dad[y][i];
        }
    }
    if(x==y) return ret;
    for(int i=20;i>=0;--i)
    {
        if(dad[y][i]!=dad[x][i])
        {
            ret=max(ret,max(up[y][i],up[x][i]));
            ret=max(ret,max(Max[y][i]-Minn,Max[x][i]-Minn));
            Minn=min(Minn,min(Min[y][i],Min[x][i]));
            y=dad[y][i];
            x=dad[x][i];
        }
    }
    return ret;
}
int Down(int x,int y)
{
    int ret=0,Maxn=0;
    if(dep[x]>dep[y]) swap(x,y);
    for(int i=20;i>=0;--i)
    {
        if(dep[dad[y][i]]>=dep[x])
        {
            ret=min(ret,down[y][i]);
            ret=min(ret,Maxn-Min[y][i]);
            Maxn=max(Maxn,Max[y][i]);
            y=dad[y][i];
        }
    }
    if(x==y) return ret;
    for(int i=20;i>=0;--i)
    {
        if(dad[y][i]!=dad[x][i])
        {
            ret=min(ret,min(down[y][i],down[x][i]));
            ret=min(ret,min(Maxn-Min[y][i],Maxn-Min[x][i]));
            Maxn=max(Maxn,max(Max[y][i],Max[x][i]));
            y=dad[y][i];
            x=dad[x][i];
        }
    }
    return ret;
}
int query_max(int x,int y)
{
    if(dep[x]>dep[y]) swap(x,y);
    int ret=Pri[y];
    for(int i=20;i>=0;--i)
    {
        if(dep[dad[y][i]]>=dep[x])
        {
            ret=max(ret,Max[y][i]);
            y=dad[y][i];
        }
    }
    if(x==y) return ret;
    for(int i=20;i>=0;--i)
    {
        if(dad[y][i]!=dad[x][i])
        {
            ret=max(ret,Max[x][i]);
            ret=max(ret,Max[y][i]);
            x=dad[x][i];
            y=dad[y][i];
        }
    }
    return ret;
}
int query_min(int x,int y)
{
    if(dep[x]>dep[y]) swap(x,y);
    int ret=Pri[y];
    for(int i=20;i>=0;--i)
    {
        if(dep[dad[y][i]]>=dep[x])
        {
            ret=min(ret,Min[y][i]);
            y=dad[y][i];
        }
    }
    if(x==y) return ret;
    for(int i=20;i>=0;--i)
    {
        if(dad[y][i]!=dad[x][i])
        {
            ret=min(ret,Min[x][i]);
            ret=min(ret,Min[y][i]);
            x=dad[x][i];
            y=dad[y][i];
        }
    }
    return ret;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&Pri[i]);
    for(int x,y,i=1;i<n;++i)
    {
        scanf("%d%d",&x,&y);
        Graph[x].push_back(y);
        Graph[y].push_back(x);
    }
    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;
        ans=max(ans,Up(x,z));
        ans=max(ans,Down(y,z));
        ans=max(ans,query_max(x,z)-query_min(y,z));
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-09-29 11:27:27

(WWWWWWWWWW)codevs 3305 水果姐逛水果街Ⅱ的相关文章

水果姐逛水果街Ⅱ codevs 3305

3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去.求最多可以赚多

codevs水果姐逛水果街3

3306 水果姐逛水果街Ⅲ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 连续两天都没有被cgh难倒,水果姐心情很不错,第三天又来逛水果街. 今天cgh早早就来到了水果街等水果姐,因为他带来了帮手cys.cgh的魔法是把水果街变成树结构,而cys的魔法是瞬间改变某家店的水果价格.一边问一边改,绝不给水果姐思考的时间! 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh和cys

【树上倍增】【分类讨论】水果姐逛水果街Ⅱ

3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,

3304 水果姐逛水果街Ⅰ

3304 水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第

【线段树】【分类讨论】水果姐逛水果街Ⅰ

3304 水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店

【树链剖分】【分类讨论】水果姐逛水果街Ⅲ

3306 水果姐逛水果街Ⅲ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 连续两天都没有被cgh难倒,水果姐心情很不错,第三天又来逛水果街. 今天cgh早早就来到了水果街等水果姐,因为他带来了帮手cys.cgh的魔法是把水果街变成树结构,而cys的魔法是瞬间改变某家店的水果价格.一边问一边改,绝不给水果姐思考的时间! 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh和cys

CodeVs——T 3305 水果姐逛水果街Ⅱ

http://codevs.cn/problem/3305/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中

CodeVs——T 3304 水果姐逛水果街Ⅰ

http://codevs.cn/problem/3304/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给

水果姐逛水果街Ⅰ(codevs 3304)

题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价. 就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去,求每个问题中最多可以赚多少钱. 输

codevs3305 水果姐逛水果街Ⅱ

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样