。。。。。。。好长啊。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 50050
#define maxe 100500
#define inf 2000000000
using namespace std;
int n,m,val[maxv],x,y,z,g[maxv],nume=,fath[maxv],top[maxv],w[maxv],fw[maxv],son[maxv],size[maxv],dis[maxv],times=;
int tot=,root,ls[maxv<<],rs[maxv<<],mn[maxv<<],mx[maxv<<],fr[maxv<<],ba[maxv<<],lazy[maxv<<];
int r1,r2,r3;
struct edge
{
int v,nxt;
}e[maxe];
int read()
{
char ch;int data=;
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='')
{
data=data*+ch-'';
ch=getchar();
}
return data;
}
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs1(int x)
{
size[x]=;son[x]=;
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=fath[x])
{
fath[v]=x;dis[v]=dis[x]+;
dfs1(v);
size[x]+=size[v];
if (size[son[x]]<size[v]) son[x]=v;
}
}
}
void dfs2(int x,int father)
{
w[x]=++times;fw[times]=x;top[x]=father;
if (son[x]) dfs2(son[x],father);
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if ((v!=fath[x]) && (v!=son[x]))
dfs2(v,v);
}
}
void reset()
{
r1=inf;r2=;r3=;
}
void pushup(int now)
{
mx[now]=max(mx[ls[now]],mx[rs[now]]);
mn[now]=min(mn[ls[now]],mn[rs[now]]);
fr[now]=max((mx[rs[now]]-mn[ls[now]]),max(fr[ls[now]],fr[rs[now]]));
ba[now]=max((mx[ls[now]]-mn[rs[now]]),max(ba[ls[now]],ba[rs[now]]));
}
void pushdown(int now,int left,int right)
{
if (!lazy[now]) return;
lazy[ls[now]]+=lazy[now];lazy[rs[now]]+=lazy[now];
mx[ls[now]]+=lazy[now];mx[rs[now]]+=lazy[now];
mn[ls[now]]+=lazy[now];mn[rs[now]]+=lazy[now];
lazy[now]=;
}
void build(int &now,int left,int right)
{
now=++tot;
if (left==right) {mn[now]=mx[now]=val[fw[left]];fr[now]=ba[now]=;return;}
int mid=(left+right)>>;
build(ls[now],left,mid);
build(rs[now],mid+,right);
pushup(now);
}
void ask(int now,int left,int right,int l,int r,int type)
{
pushdown(now,left,right);
if ((left==l) && (right==r))
{
if (type==) r3=max(r3,mx[now]-r1);else r3=max(r3,r2-mn[now]);
if (type==) r3=max(r3,fr[now]);else r3=max(r3,ba[now]);
r1=min(r1,mn[now]);r2=max(r2,mx[now]);
return;
}
int mid=(left+right)>>;
if (r<=mid) ask(ls[now],left,mid,l,r,type);
else if (l>=mid+) ask(rs[now],mid+,right,l,r,type);
else
{
ask(ls[now],left,mid,l,mid,type);
ask(rs[now],mid+,right,mid+,r,type);
}
}
void modify(int now,int left,int right,int l,int r,int x)
{
pushdown(now,left,right);
if ((left==l) && (right==r))
{
lazy[now]+=x;mn[now]+=x;mx[now]+=x;
return;
}
int mid=(left+right)>>;
if (r<=mid) modify(ls[now],left,mid,l,r,x);
else if (l>=mid+) modify(rs[now],mid+,right,l,r,x);
else
{
modify(ls[now],left,mid,l,mid,x);
modify(rs[now],mid+,right,mid+,r,x);
}
pushup(now);
}
int lca(int x,int y)
{
int f1=top[x],f2=top[y];
while (f1!=f2)
{
if (dis[f1]<dis[f2]) {swap(f1,f2);swap(x,y);}
x=fath[f1];f1=top[x];
}
if (dis[x]<dis[y]) return x;else return y;
}
void find_answer(int x,int y,int z)
{
int ans=,t=lca(x,y),mn,mx;
int f1=top[x],f2=top[y];
mn=inf;mx=;
while (f1!=top[t])
{
reset();ask(root,,n,w[f1],w[x],);
ans=max(ans,r2-mn);ans=max(ans,r3);mn=min(mn,r1);
x=fath[f1];f1=top[x];
}
reset();ask(root,,n,w[t],w[x],);
ans=max(ans,r2-mn);ans=max(ans,r3);mn=min(mn,r1);
while (f2!=top[t])
{
reset();ask(root,,n,w[f2],w[y],);
ans=max(ans,mx-r1);ans=max(ans,r3);mx=max(mx,r2);
y=fath[f2];f2=top[y];
}
reset();ask(root,,n,w[t],w[y],);
ans=max(ans,mx-r1);ans=max(ans,r3);mx=max(mx,r2);
ans=max(ans,mx-mn);
printf("%d\n",ans);
}
void modify_tree(int x,int y,int z)
{
int f1=top[x],f2=top[y];
while (f1!=f2)
{
if (dis[f1]<dis[f2]) {swap(f1,f2);swap(x,y);}
modify(root,,n,w[f1],w[x],z);
x=fath[f1];f1=top[x];
}
if (dis[x]>dis[y]) swap(x,y);
modify(root,,n,w[x],w[y],z);
}
int main()
{
n=read();
for (int i=;i<=n;i++) val[i]=read();
for (int i=;i<=n-;i++)
{
x=read();y=read();
addedge(x,y);addedge(y,x);
}
dfs1();
dfs2(,);
build(root,,n);
m=read();
for (int i=;i<=m;i++)
{
x=read();y=read();z=read();
find_answer(x,y,z);
modify_tree(x,y,z);
}
return ;
}

BZOJ 3999 旅游的更多相关文章

  1. bzoj 3999: [TJOI2015]旅游

    Description 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会 ...

  2. bzoj 3999: [TJOI2015]旅游 LCT

    没啥难的,inf 的值设小了调了半天~ code: #include <bits/stdc++.h> #define N 50003 #define lson t[x].ch[0] #de ...

  3. BZOJ 2157: 旅游( 树链剖分 )

    树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...

  4. bzoj 2157: 旅游 (LCT 边权)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 题面; 2157: 旅游 Time Limit: 10 Sec  Memory Lim ...

  5. bzoj 3999 线段树区间提取 有序链剖

    看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...

  6. 【刷题】BZOJ 2157 旅游

    Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...

  7. BZOJ 2157: 旅游

    2157: 旅游 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1347  Solved: 619[Submit][Status][Discuss] ...

  8. BZOJ P2157 旅游

    题目大意: 维护一棵树,每条边有边权,支持下列操作:1.修改某条边的边权2.将某条路经上的边权取反3.询问某条路经上的和4.询问某条路经上的最大值5.询问某条路经上的最小值 --by BZOJ; ht ...

  9. bzoj [POI2007]旅游景点atr 状态压缩+Dij

    [POI2007]旅游景点atr Time Limit: 30 Sec  Memory Limit: 357 MBSubmit: 2258  Solved: 595[Submit][Status][D ...

随机推荐

  1. [Jetty] jetty 内存调优

    在start.ini中配置代码如下 -Dcom.sun.management.jmxremote=true -Xmx6144m -XX:PermSize=256M -XX:MaxPermSize=10 ...

  2. Windows安装Python图像处理库:PIL模块

    平常一般都在Linux下用Python,今天女票突然说让帮忙把一些图片全部弄成一个分辨率的,作为程序员,这种重复的工作还是交给计算机吧. 废话不多说,打开Cmd看下Windows的python下面是否 ...

  3. hduoj----1142A Walk Through the Forest(记忆化搜索+最短路)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  4. centOS wget的安装和使用

    CentOS wget是一个从网络上自动下载文件的自由工具.它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. 所谓的自动下载是指,CentOS wget可以在用户退出系统的之后在后台执行 ...

  5. 【转载】SAP的标准对话框函数

    http://blog.sina.com.cn/s/blog_721b218c01012j0y.html 在用户设计sap的程序时,经常需要一些对话框,用户可以自己编写,但使用SAP系统中提供了的对话 ...

  6. 修改Linux系统时区

    修改配置文件来修改时区1.修改/etc/sysconfig/clock         ZONE=Asia/Shanghai 2.rm /etc/localtime3.链接到上海时区文件 ln -sf ...

  7. 安装VC6提示找不到ACME时的解决办法

    将安装程序COPY到电脑上1.打开setupwiz.ini,把"acme=acmboot.exe"改为"=acmsetup.exe";2.STF=setup/v ...

  8. GO工程和包

    转载:http://blog.csdn.net/achelloworld/article/details/43956831 在Go语言中,包是函数与数据的集合,用package定义一个包,包的名字不一 ...

  9. urlencode在url中的作用

    urlencode编码能解决特殊字符的传输问题. 使用urlencode主要用于正常识别输入的汉字.空格以及其他特殊字符. 列如: 一产品名称为A&T Plastic,在产品列表中就产生了这样 ...

  10. Windows Store App 用户库文件操作

    (1)获取用户库位置 如果想要通过应用程序在用户库中创建文件,首先需要获得用户库中指定的位置,例如图片库.文档库等.这里值得注意的是,在获取用户库的位置之前,必须在Windows应用商店项目的清单文件 ...