。。。。。。。好长啊。

#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. web 页面内容优化管理与性能技巧

    回想一下,以前我们不得不花费大量时间去优化页面内容(图片.CSS等等),如今用户有更快速的互联网链接,我们似乎能够使用更大的图像或更大的闪存文件,里面包含的有视频或者图片.然而,随着移动开发的兴起,我 ...

  2. nodeschool.io 9

    ~~ JUGGLING ASYNC ~~ 其实就是一个循环,在循环里面输出的顺序,和排列后在外面的顺序不一样,这是为什么呢? 用第三方async包,直接报错了…… This problem is th ...

  3. Java 基础知识点(必知必会其一)

    如何将字符串转换为数字? package Day_2; /** * @author Administrator * 功能: 如何将字符串转换为数字? */ public class StringToI ...

  4. 深入入门正则表达式(java)

    一.入门基础 1.元字符 很多人对正则表达式的印象就是乱码..许许多多的符号组合在一起,偶见单词,正则确实是这样的,所以下面我们要看看这些符号都是什么意思 有些符号不是大家看到的字面上的意思:比如“. ...

  5. ABAP简单表维护的制作

    为了知识的积累,特作了个简单的表维护. 因为自己之前做dynpro程序的时候建了一个Tree node的表,所以就不在此重复.(在表的交付和维护页签中标的属性要是‘允许标准表维护的’) 直接Alt+U ...

  6. 聚类算法:ISODATA算法

    1. 与K-均值算法的比较 –K-均值算法通常适合于分类数目已知的聚类,而ISODATA算法则更加灵活: –从算法角度看, ISODATA算法与K-均值算法相似,聚类中心都是通过样本均值的迭代运算来决 ...

  7. php中PCRE正则表达式分隔符的使用

    转自:http://www.baiwar.com/post/the-use-of-php-pcre-regex-delimiter.html 在php5.3.0以前,PHP可使用两套正则表达式规则,一 ...

  8. hihocoder 1138 Islands Travel dijkstra+heap 难度:2

    http://hihocoder.com/problemset/problem/1138 很久不用最短路,几乎连基本性质也忘了,结果这道题就是某些最短路算法空间复杂度是o(n) 这里总结四种算法 算法 ...

  9. HDU 3074 Multiply game(线段树)

    单点更新,更新时先除去 原来的数,因为有去摸,可以用乘上逆元代替. //================================================================ ...

  10. partition by

    在row_number() over()中的over使用,其后需要配合order by   ROW_NUMBER () over (partition by username   order by i ...