codevs 3305 水果姐逛水果街Ⅱ

/*我尼玛 又一个min打成max 看了半天....*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200010
#define inf 0x7fffffff
using namespace std;
int n,m,head[maxn],num,v[maxn],fa[maxn][25],c[maxn];
int mii[maxn][25],mxx[maxn][25],up[maxn][25],down[maxn][25];
struct node{
    int v,pre;
}e[maxn*2];
int init(){
    int x=0;char s=getchar();
    while(s<‘0‘||s>‘9‘)s=getchar();
    while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();}
    return x;
}
void Add(int from,int to){
    num++;e[num].v=to;
    e[num].pre=head[from];
    head[from]=num;
}
void Dfs(int now,int from,int dep,int val){
    fa[now][0]=from;c[now]=dep;
    mii[now][0]=min(val,v[now]);
    mxx[now][0]=max(val,v[now]);
    up[now][0]=max(0,v[from]-v[now]);
    down[now][0]=max(0,v[now]-v[from]);
    for(int i=head[now];i;i=e[i].pre){
        if(e[i].v==from)continue;
        Dfs(e[i].v,now,dep+1,v[now]);
    }
}
void Get_fa(){
    for(int j=1;j<=20;j++)
        for(int i=1;i<=n;i++){
            fa[i][j]=fa[fa[i][j-1]][j-1];
            mii[i][j]=min(mii[i][j-1],mii[fa[i][j-1]][j-1]);
            mxx[i][j]=max(mxx[i][j-1],mxx[fa[i][j-1]][j-1]);
            up[i][j]=max(up[i][j-1],up[fa[i][j-1]][j-1]);
            up[i][j]=max(up[i][j],mxx[fa[i][j-1]][j-1]-mii[i][j-1]);
            down[i][j]=max(down[i][j-1],down[fa[i][j-1]][j-1]);
            down[i][j]=max(down[i][j],mxx[i][j-1]-mii[fa[i][j-1]][j-1]);
        }
}
int LCA(int a,int b){
    if(c[a]<c[b])swap(a,b);
    int t=c[a]-c[b];
    for(int i=0;i<=20;i++)
        if((1<<i)&t)a=fa[a][i];
    if(a==b)return a;
    for(int i=20;i>=0;i--)
        if(fa[a][i]!=fa[b][i]){
            a=fa[a][i];
            b=fa[b][i];
        }
    return fa[a][0];
}
int Up_lca(int a,int b){
    int t=c[a]-c[b],ret=0,minner=inf;
    for(int i=0;i<=20;i++)
        if((1<<i)&t){
            ret=max(ret,up[a][i]);
            ret=max(ret,mxx[a][i]-minner);
            minner=min(minner,mii[a][i]);
            a=fa[a][i];
        }
    return ret;
}
int Down_lca(int a,int b){
    int t=c[a]-c[b],ret=0,maxxer=0;
    for(int i=0;i<=20;i++)
        if((1<<i)&t){
            ret=max(ret,down[a][i]);
            ret=max(ret,maxxer-mii[a][i]);
            maxxer=max(maxxer,mxx[a][i]);
            a=fa[a][i];
        }
    return ret;
}
int Query_max(int a,int b){
    int t=c[a]-c[b],maxxer=v[a];
    for(int i=0;i<=20;i++)
        if((1<<i)&t){
            maxxer=max(maxxer,mxx[a][i]);
            a=fa[a][i];
        }
    return maxxer;
}
int Query_min(int a,int b){
    int t=c[a]-c[b],minner=v[a];
    for(int i=0;i<=20;i++)
        if((1<<i)&t){
            minner=min(minner,mii[a][i]);
            a=fa[a][i];
        }
    return minner;
}
int main()
{
    n=init();
    for(int i=1;i<=n;i++)
        v[i]=init();
    int u,v;
    for(int i=1;i<n;i++){
        u=init();v=init();
        Add(u,v);Add(v,u);
    }
    memset(mii,127,sizeof(mii));
    Dfs(1,0,0,0);Get_fa();
    m=init();
    while(m--){
        u=init();v=init();
        int anc=LCA(u,v);
        //printf("%d\n",anc);
        int ans=0;
        ans=max(Up_lca(u,anc),Down_lca(v,anc));
        ans=max(ans,Query_max(v,anc)-Query_min(u,anc));
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-29 19:11:46

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,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样