题目描述 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

—————————————————————

算是一道lct的裸题了吧

只有查询无修改 注意一下up就可以了

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL unsigned int
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int c[M][],fa[M],rev[M];
struct node{int v,mx,mn,lr,rl;}tr[M];
int n,m;
bool isrt(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
void up(int x){
int l=c[x][],r=c[x][];
tr[x].mx=tr[x].mn=tr[x].v;
tr[x].lr=tr[x].rl=;
if(l){
tr[x].lr=max(tr[l].lr,tr[x].mx-tr[l].mn);
tr[x].rl=max(tr[l].rl,tr[l].mx-tr[x].mn);
tr[x].mx=max(tr[x].mx,tr[l].mx);
tr[x].mn=min(tr[x].mn,tr[l].mn);
}
if(r){
tr[x].lr=max(tr[x].lr,tr[r].lr);
tr[x].lr=max(tr[x].lr,tr[r].mx-tr[x].mn);
tr[x].rl=max(tr[x].rl,tr[r].rl);
tr[x].rl=max(tr[x].rl,tr[x].mx-tr[r].mn);
tr[x].mx=max(tr[x].mx,tr[r].mx);
tr[x].mn=min(tr[x].mn,tr[r].mn);
}
}
void modify(int x){
rev[x]^=;
swap(c[x][],c[x][]);
swap(tr[x].lr,tr[x].rl);
}
void down(int x){
if(rev[x]){
int l=c[x][],r=c[x][];
modify(l); modify(r);
rev[x]=;
}
}
void rotate(int x){
int y=fa[x],z=fa[y],l=,r=;
if(c[y][]==x) l=,r=;
if(!isrt(y)) c[z][c[z][]==y]=x;
fa[y]=x; fa[x]=z; fa[c[x][r]]=y;
c[y][l]=c[x][r]; c[x][r]=y;
up(y);
}
int st[M],top,S;
void splay(int x){
st[++top]=x; for(int i=x;!isrt(i);i=fa[i]) st[++top]=fa[i];
while(top) down(st[top--]);
while(!isrt(x)){
int y=fa[x],z=fa[y];
if(!isrt(y)){
if(c[z][]==y^c[y][]==x) rotate(x);
else rotate(y);
}
rotate(x);
}up(x);
}
void acs(int x0){
for(int x=x0,y=;x;splay(x),c[x][]=y,up(x),y=x,x=fa[x]);
splay(x0);
}
void mrt(int x){acs(x); modify(x);}
void link(int x,int y){mrt(x); fa[x]=y;}
void split(int x,int y){mrt(x); acs(y);}
int main()
{
int x,y;
n=read();
for(int i=;i<=n;i++) tr[i].v=read();
for(int i=;i<n;i++) x=read(),y=read(),link(x,y);
m=read();
for(int i=;i<=m;i++){
x=read(); y=read();
split(x,y);
printf("%d\n",tr[y].lr);
}
return ;
}

3006比3005就多了一个修改 代码也就多一行QAQ

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL unsigned int
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int c[M][],fa[M],rev[M];
struct node{int v,mx,mn,lr,rl;}tr[M];
int n,m;
bool isrt(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
void up(int x){
int l=c[x][],r=c[x][];
tr[x].mx=tr[x].mn=tr[x].v;
tr[x].lr=tr[x].rl=;
if(l){
tr[x].lr=max(tr[l].lr,tr[x].mx-tr[l].mn);
tr[x].rl=max(tr[l].rl,tr[l].mx-tr[x].mn);
tr[x].mx=max(tr[x].mx,tr[l].mx);
tr[x].mn=min(tr[x].mn,tr[l].mn);
}
if(r){
tr[x].lr=max(tr[x].lr,tr[r].lr);
tr[x].lr=max(tr[x].lr,tr[r].mx-tr[x].mn);
tr[x].rl=max(tr[x].rl,tr[r].rl);
tr[x].rl=max(tr[x].rl,tr[x].mx-tr[r].mn);
tr[x].mx=max(tr[x].mx,tr[r].mx);
tr[x].mn=min(tr[x].mn,tr[r].mn);
}
}
void modify(int x){
rev[x]^=;
swap(c[x][],c[x][]);
swap(tr[x].lr,tr[x].rl);
}
void down(int x){
if(rev[x]){
int l=c[x][],r=c[x][];
modify(l); modify(r);
rev[x]=;
}
}
void rotate(int x){
int y=fa[x],z=fa[y],l=,r=;
if(c[y][]==x) l=,r=;
if(!isrt(y)) c[z][c[z][]==y]=x;
fa[y]=x; fa[x]=z; fa[c[x][r]]=y;
c[y][l]=c[x][r]; c[x][r]=y;
up(y);
}
int st[M],top,S;
void splay(int x){
st[++top]=x; for(int i=x;!isrt(i);i=fa[i]) st[++top]=fa[i];
while(top) down(st[top--]);
while(!isrt(x)){
int y=fa[x],z=fa[y];
if(!isrt(y)){
if(c[z][]==y^c[y][]==x) rotate(x);
else rotate(y);
}
rotate(x);
}up(x);
}
void acs(int x0){
for(int x=x0,y=;x;splay(x),c[x][]=y,up(x),y=x,x=fa[x]);
splay(x0);
}
void mrt(int x){acs(x); modify(x);}
void link(int x,int y){mrt(x); fa[x]=y;}
void split(int x,int y){mrt(x); acs(y);}
int main()
{
int k,x,y;
n=read();
for(int i=;i<=n;i++) tr[i].v=read();
for(int i=;i<n;i++) x=read(),y=read(),link(x,y);
m=read();
for(int i=;i<=m;i++){
k=read();
x=read(); y=read();
if(k) split(x,y),printf("%d\n",tr[y].lr);
else splay(x),tr[x].v=y,up(x);
}
return ;
}

codevs 3305 水果姐逛水果街Ⅱ&&codevs3006的更多相关文章

  1. 水果姐逛水果街Ⅱ codevs 3305

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB   题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔 ...

  2. code vs 3305 水果姐逛水果街Ⅱ

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 水果姐第二天心情也很不错, ...

  3. Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA

    题目:http://codevs.cn/problem/3305/  时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 Des ...

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

    http://codevs.cn/problem/3305/  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 De ...

  5. Codevs 3304 水果姐逛水果街Ⅰ 线段树

    题目: http://codevs.cn/problem/3304/   时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 D ...

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

    http://codevs.cn/problem/3304/ 时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Des ...

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

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

  8. codevs3305 水果姐逛水果街Ⅱ

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  9. codevs3304 水果姐逛水果街

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

随机推荐

  1. bam文件测序深度统计-bamdst

    最近接触的数据都是靶向测序,或者全外测序的数据.对数据的覆盖深度及靶向捕获效率的评估成为了数据质量监控中必不可少的一环. 以前都是用samtools depth 算出单碱基的深度后,用perl来进行深 ...

  2. Python升级3.6 强力Django+Xadmin打造在线教育平台

    第 1 章 课程介绍 1-1 项目演示和课程介绍: 第 2 章 Windows下搭建开发环境 2-1 Pycharm.Navicat和Python解释器的安装: Pycharmhttp://www.j ...

  3. Halcon环境搭建

    1.Visual Studio 2017安装教程 2.Qt5.9安装教程 3.VS2017中Qt插件安装教程

  4. EM算法浅析(一)-问题引出

    EM算法浅析,我准备写一个系列的文章: EM算法浅析(一)-问题引出 EM算法浅析(二)-算法初探 一.基本认识 EM(Expectation Maximization Algorithm)算法即期望 ...

  5. 树莓派配置 USB 无线网卡

    树莓派配置 USB 无线网卡来上网的过程. 本人使用的USB无线网卡型号:EP-N8508GS(树莓派专用型号) 一.检查 USB 无线网卡是否已经正确识别 将无线 USB 网卡插入树莓派后启动树莓派 ...

  6. SPOJ 375 Query on a tree(树链剖分)(QTREE)

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  7. 简单java采集程序一

    [目标任务]通过该网站采集全国的手机号码段至数据库表中 [完成过程] 1.初涉正则表达式,学会写简单的正则表达式 2.获取单个网页内容,学会java中基本的IO流 3.将获取数据插入mysql数据库表 ...

  8. Linux SPI总线和设备驱动架构之一:系统概述

    SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器.传感器.存储设备,SPI设备分为主设备和从设备两种,用 ...

  9. 软工实践 - 第二十五次作业 Beta 冲刺(3/7)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10116979.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  10. hadoop 2.6.0 伪分布式部署安装遇到的问题

    之前读到了一篇关于配置安装hadoop的博文(地址:http://www.powerxing.com/install-hadoop/)能正确安装和运行,但是在网页进行Jobtracker监控时,输入l ...