BZOJ 3999 旅游
。。。。。。。好长啊。
#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 旅游的更多相关文章
- bzoj 3999: [TJOI2015]旅游
Description 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会 ...
- bzoj 3999: [TJOI2015]旅游 LCT
没啥难的,inf 的值设小了调了半天~ code: #include <bits/stdc++.h> #define N 50003 #define lson t[x].ch[0] #de ...
- BZOJ 2157: 旅游( 树链剖分 )
树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...
- bzoj 2157: 旅游 (LCT 边权)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 题面; 2157: 旅游 Time Limit: 10 Sec Memory Lim ...
- bzoj 3999 线段树区间提取 有序链剖
看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...
- 【刷题】BZOJ 2157 旅游
Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间 ...
- BZOJ 2157: 旅游
2157: 旅游 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1347 Solved: 619[Submit][Status][Discuss] ...
- BZOJ P2157 旅游
题目大意: 维护一棵树,每条边有边权,支持下列操作:1.修改某条边的边权2.将某条路经上的边权取反3.询问某条路经上的和4.询问某条路经上的最大值5.询问某条路经上的最小值 --by BZOJ; ht ...
- bzoj [POI2007]旅游景点atr 状态压缩+Dij
[POI2007]旅游景点atr Time Limit: 30 Sec Memory Limit: 357 MBSubmit: 2258 Solved: 595[Submit][Status][D ...
随机推荐
- JS获取页面元素并修改
//实现代码如下,非常简单<script> (function(){ var ele = document.getElementsByTagName("ul"); // ...
- 《javascript高级程序设计》 第24章 最佳实践 Best Practices
24.1 可维护性 Maintainability24.1.1 什么是可维护的代码 What Is Maintainable Code?24.1.2 代码约定 Code Conventions 24. ...
- poj1129 Channel Allocation(染色问题)
题目链接:poj1129 Channel Allocation 题意:要求相邻中继器必须使用不同的频道,求需要使用的频道的最少数目. 题解:就是求图的色数,这里采用求图的色数的近似有效算法——顺序着色 ...
- tab切换-自动、点击、内容变换
<div class="tab"> <ul class="pics"> ...
- PHP可变长函数方法介绍
1.三个重要函数 func_num_args() 返回实参个数 func_get_arg(i) 返回某个实参的值 func_get_args() 以数组的形式返回实参 ...
- JavaScript中的test()方法
定义和用法 test() 方法用于检测一个字符串是否匹配某个模式. 语法 RegExpObject.test(string) 参数 描述 string 必需.要检测的字符串. 返回值 如果字符串 st ...
- 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据
一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...
- 自定义Encoder/Decoder进行对象传递
转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...
- Xmanager如何连接图形化界面
1.编辑gnome配置文件vim /etc/gdm/custom.conf # GDM configuration storage [daemon]RemoteGreeter= /usr/libexe ...
- 搜索功能demo
代码如下: <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edg ...