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 ...
随机推荐
- 《Java程序设计》实验五 实验报告
实验五 java网络编程 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2. ...
- 关于JVM的类型和模式
原文出处: 摆渡者 引言 曾几何时,我也敲打过无数次这样的命令: 然而之前的我都只关心过版本号,也就是第一行的内容.今天,我们就来看看第3行输出的内容:JVM的类型和工作模式. 其实说Server和C ...
- Qt之QLineEdit
简述 QLineEdit是一个单行文本输入框. QLineEdit允许用户输入和编辑单行纯文本,提供了很多有用的编辑功能,包括:撤消和重做.剪切和粘贴.以及拖放(见setDragEnabled()). ...
- 179. Largest Number -- 数字字符串比较大小
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- js——页面回到顶部
很久都没有去慕课网学习学习了,刚恰好就看见了一个用的比较多的小例子——页面回到顶部,记得之前自己也是在初学web时,被这个坑了一回,因此今天特地拿来分享分享…… <!DOCTYPE html&g ...
- httpClient 4.x post get方法
public static String doPost(String url, String encoding, String contentType, String sendData) throws ...
- BZOJ3058 四叶草魔杖
Poetize11的T3 蒟蒻非常欢脱的写完了费用流,发现...边的cost竟然只算一次!!! 然后就跪了... Orz题解:"类型:Floyd传递闭包+最小生成树+状态压缩动态规划首先Fl ...
- mysql在一台服务器搭建主从1
1. 登录mysq的方法: mysql-S /tmp/mysql.sock 登录3306 mysql -S /tmp/mysql_slave.sock 登录3307 mysql -h 127.0. ...
- java面向对象编程--第九章 多态和抽象
9.1多态 在生物学中,是指一个生物或物种可以有多种不同的形式或阶段: 在OOP中,多态是指一个对象有多种形式的能力. 多态可以说是面向对象编程的精髓所在.java中之所以引入多态的概念,原因之一是它 ...
- 使用ContentProvider管理多媒体-----向多媒体数据中添加数据
//为add按钮的单击事件绑定监听器 add.setOnClickListener(new OnClickListener() { @Override public void onClick(View ...