HDU 5052 Yaoge’s maximum profit 光秃秃的树链拆分 2014 ACM/ICPC Asia Regional Shanghai Online
意甲冠军:
特定n小点的树权。
以下n每一行给出了正确的一点点来表达一个销售点每只鸡价格的格
以下n-1行给出了树的侧
以下Q操作
Q行
u, v, val
从u走v,程中能够买一个鸡腿,然后到后面卖掉,输出max(0, 最大的收益)
然后给[u,v]路径上点点权+=val
思路:
树链剖分裸题。记录区间的最大最小值,→走的答案和←走的答案。
官方题解:点击打开链接
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll inf = 1e16;
inline void rd(int &n){
n = 0;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') n *= 10, n += (c - '0'),c = getchar();
}
void pt64(ll num){
if(num<0) {
putchar('-');
num=-num;
}
int ans[20],top=0;
while(num!=0) {
ans[top++]=num%10;
num/=10;
}
if(top==0) putchar('0');
for(int i=top-1;i>=0;i--)
putchar(ans[i]+'0');
putchar('\n');
}
#define N 50010
struct Edge{
int to, nex;
}edge[N*2];
int head[N], edgenum;
void add(int u, int v){ Edge E = {v, head[u]}; edge[edgenum] = E; head[u] = edgenum++;}
void init(){memset(head, -1, sizeof head); edgenum = 0;}
int fa[N], son[N], siz[N], dep[N], tree_id;
//父节点 重儿子 子树节点数 深度 线段树标号
int w[N], fw[N], p[N];
//父边在线段树中的标号 节点顶端的点
void dfs(int u, int Father, int deep){
fa[u] = Father; son[u] = 0; dep[u] = deep; siz[u] = 1;
for(int i = head[u]; ~i; i = edge[i].nex) {
int v = edge[i].to; if(v == Father) continue;
dfs(v, u, deep+1);
siz[u] += siz[v];
if(siz[v] > siz[son[u]])son[u] = v;
}
}
void Have_p(int u, int Father){
w[u] = ++ tree_id; fw[tree_id] = u; p[u] = Father;
if(son[u])
Have_p(son[u], Father);
else return ;
for(int i = head[u]; ~i; i = edge[i].nex) {
int v = edge[i].to; if(v == fa[u] || v == son[u])continue;
Have_p(v, v);
}
}
#define Lson(x) tree[x].l
#define Rson(x) tree[x].r
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define Lazy(x) tree[x].lazy
#define Ans0(x) tree[x].ans[0]
#define Ans1(x) tree[x].ans[1]
#define Min(x) tree[x].min
#define Max(x) tree[x].max
struct node {
int l, r;
ll ans[2], min, max, lazy;
}tree[N<<2];
int a[N];
void push_down(int id){
if(Lazy(id)){
Min(L(id)) += Lazy(id);
Max(L(id)) += Lazy(id);
Min(R(id)) += Lazy(id);
Max(R(id)) += Lazy(id);
Lazy(L(id)) += Lazy(id);
Lazy(R(id)) += Lazy(id);
Lazy(id) = 0;
}
}
void push_up(int id){
Min(id) = min(Min(L(id)), Min(R(id)));
Max(id) = max(Max(L(id)), Max(R(id)));
Ans0(id) = max(Ans0(L(id)), Ans0(R(id)));
Ans0(id) = max(Ans0(id), Max(R(id)) - Min(L(id)));
Ans1(id) = max(Ans1(L(id)), Ans1(R(id)));
Ans1(id) = max(Ans1(id), Max(L(id)) - Min(R(id)));
}
void build(int l, int r, int id){
Lson(id) = l; Rson(id) = r;
Lazy(id) = 0;
if(l == r) {
Ans0(id) = Ans1(id) = 0;
Min(id) = Max(id) = (ll)a[fw[l]];
return ;
}
int mid = (l + r)>>1;
build(l, mid, L(id)); build(mid+1, r, R(id));
push_up(id);
}
void updata(int l, int r, ll val, int id){
if(l == Lson(id) && Rson(id) == r){
Min(id) += val;
Max(id) += val;
Lazy(id) += val;
return ;
}
push_down(id);
int mid = (Lson(id) + Rson(id)) >>1;
if(mid < l)
updata(l, r, val, R(id));
else if(r <= mid)
updata(l, r, val, L(id));
else {
updata(l, mid, val, L(id));
updata(mid+1, r, val, R(id));
}
push_up(id);
}
ll query(int l, int r, int hehe, ll &minn, ll &maxx, int id){
if(l == Lson(id) && Rson(id) == r){
maxx = Max(id);
minn = Min(id);
if(hehe == 0) return Ans0(id);
else return Ans1(id);
}
push_down(id);
int mid = (Lson(id) + Rson(id)) >>1;
if(mid < l)
return query(l, r, hehe, minn, maxx, R(id));
else if(r <= mid)
return query(l, r, hehe, minn, maxx, L(id));
else {
ll maxl = 0, minl = 0, maxr = 0, minr = 0, ans;
ans = max(query(l, mid, hehe, minl, maxl, L(id)), query(mid+1, r, hehe, minr, maxr, R(id)));
maxx = max(maxl, maxr);
minn = min(minl, minr);
if(hehe == 0) {
return max(ans, maxr - minl);
}
else {
return max(ans, maxl - minr);
}
}
}
int n, que;
ll Qu(int l, int r){
int f1 = p[l], f2 = p[r];
ll ans = 0, maxl = -inf, minl = inf, maxr = -inf, minr = inf, tmax, tmin;
while(f1 != f2){
if(dep[f1] > dep[f2]) {
ans = max(ans, query(w[f1], w[l], 1, tmin, tmax, 1));
ans = max(ans, tmax - minl);
maxl = max(maxl, tmax);
minl = min(minl, tmin);
l = fa[f1]; f1 = p[l];
}
else {
ans = max(ans, query(w[f2], w[r], 0, tmin, tmax, 1));
ans = max(ans, maxr - tmin);
maxr = max(maxr, tmax);
minr = min(minr, tmin);
r = fa[f2]; f2 = p[r];
}
}
if(dep[l] < dep[r]) {
ans = max(ans, query(w[l], w[r], 0, tmin, tmax, 1));
}
else {
ans = max(ans, query(w[r], w[l], 1, tmin, tmax, 1));
}
ans = max(ans, tmax - minl);
ans = max(ans, maxr - tmin);
ans = max(ans, maxr - minl);
return ans;
}
void Up(int l, int r, ll val){
int f1 = p[l], f2 = p[r];
while(f1 != f2) {
if(dep[f1] < dep[f2])
swap(f1, f2), swap(l, r);
updata(w[f1], w[l], val, 1);
l = fa[f1]; f1 = p[l];
}
if(dep[l] > dep[r]) swap(l, r);
updata(w[l], w[r], val, 1);
}
void input() {
init();
rd(n);
for(int i = 1; i <= n; i++) rd(a[i]);
for(int i = 1, u, v; i < n; i++) {
rd(u); rd(v);
add(u, v); add(v, u);
}
siz[0] = tree_id = 0;
dfs(1, 1, 1);
Have_p(1, 1);
build(1, n, 1);
}
int main() {
int T, Cas = 1, u, v, val; rd(T);
while (T -- ) {
input();
rd(que);
while( que -- ) {
rd(u); rd(v); rd(val);
pt64( Qu(u, v) );
Up(u, v, (ll)val);
}
}
return 0;
}
/*
99
8
3 2 1 5 4 6 7 2
1 2
2 3
2 4
3 5
5 6
5 8
4 7
99
2 6 2
3 4 5
6 1 2
5 7 3
8 1 4
2 3 1
4 4 1
6 3 5
4 7 2
7 6 3
5 8 3 12
3 4 2 1 5 9 6 10 8 7 11 12
1 3
1 2
3 4
2 5
2 6
5 7
7 9
7 10
6 8
8 11
12 8
8
1 12 0
4 5 0
10 12 0
7 12 3
11 6 2
4 12 100
4 12 0
7 12 3 8
42 68 35 1 70 25 79 59
1 2
2 3
2 4
3 5
5 6
5 8
4 7
30
3 1 2
2 2 4
2 4 4
7 4 5
8 5 7
2 5 7
6 5 7
8 8 7
4 3 6
1 4 4
4 7 8
4 3 6
2 1 6
8 6 5
4 5 7
6 6 4
4 6 2
3 5 4
7 3 1
3 1 7
1 1 7
6 3 2
3 7 7
6 2 5
6 8 5
3 5 1
7 1 4
5 1 8
3 4 2
3 7 3 */
版权声明:本文博客原创文章。博客,未经同意,不得转载。
HDU 5052 Yaoge’s maximum profit 光秃秃的树链拆分 2014 ACM/ICPC Asia Regional Shanghai Online的更多相关文章
- hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)
Mart Master II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- Hdu 5052 Yaoge’s maximum profit(树链剖分)
题目大意: 给出一棵树.每一个点有商店.每一个商店都有一个价格,Yaoge每次从x走到y都能够在一个倒卖商品,从中得取利益.当然,买一顶要在卖之前.可是没次走过一条路,这条路上的全部商品都会添加一个v ...
- HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...
- HDU 4757 Tree(可持久化字典树)(2013 ACM/ICPC Asia Regional Nanjing Online)
Problem Description Zero and One are good friends who always have fun with each other. This time, ...
- HDU 4729 An Easy Problem for Elfness(主席树)(2013 ACM/ICPC Asia Regional Chengdu Online)
Problem Description Pfctgeorge is totally a tall rich and handsome guy. He plans to build a huge wat ...
- HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)
思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’ 'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...
- HDU 5002 Tree(动态树LCT)(2014 ACM/ICPC Asia Regional Anshan Online)
Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node ...
- HDU 5000 Clone(离散数学+DP)(2014 ACM/ICPC Asia Regional Anshan Online)
Problem Description After eating food from Chernobyl, DRD got a super power: he could clone himself ...
- 2014 ACM/ICPC Asia Regional Xi'an Online(HDU 5007 ~ HDU 5017)
题目链接 A题:(字符串查找,水题) 题意 :输入字符串,如果字符串中包含“ Apple”, “iPhone”, “iPod”, “iPad” 就输出 “MAI MAI MAI!”,如果出现 “Son ...
随机推荐
- 重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示
原文:重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示 [源码下载] 重新想象 Windows 8 Store Ap ...
- 【Android进阶】Android面试题目整理与讲解(二)
1. ArrayList,Vector, LinkedList 的存储性能和特性 ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们 ...
- 重新想象 Windows 8 Store Apps (20) - 动画: ThemeAnimation(主题动画)
原文:重新想象 Windows 8 Store Apps (20) - 动画: ThemeAnimation(主题动画) [源码下载] 重新想象 Windows 8 Store Apps (20) - ...
- Android 导入第三方jar时 出现ClassNotFoundException
处理方式: 1.首先检查有没有正确的导入该jar和有没有重复导入该jar. 2.如果没有出现1的问题,那么在buildpath->order and export 中将你导入的jar左边的复选框 ...
- 得知Android小遴选程序第七头(他们定义对话框、Gallery、ImageSwitcher)
效果如下面的: 一共一个activity和两个xml. ******当我们须要使用的组件不在setContentView()设置的布局文件里,那我们就须要使用inflate()方 ...
- Directx11学习笔记【四】 封装一个简单的Dx11DemoBase
根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBas ...
- IT忍者神龟之使用 PowerDesigner
1. 启动 PowerDesigner 新建物理数据模型 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmlweWhk/font/5a6L5L2T/fon ...
- NET中小型企业项目开发框架系列(一个)
当时的前端,我们开发了基于Net一组结构sprint.NET+NHibernate+MVC+WCF+EasyUI等中小型企业级系统开发平台,如今把整个开发过程中的步步进展整理出来和大家分享,这个系列可 ...
- Android - 分享内容 - 添加一个简单的分享操作
在ActionBar上使用ActionProvider实现一个高效的友好的分享操作在Android 4.0(API等级14)上更容易了.一个ActionProvider,一旦附加到action bar ...
- DisplayContent、StackBox、TaskStack笔记
文章仅零散记录自己的一点理解,仅供自己參考. 每一个显示设备,都有一个Display对象,DisplayManagerService专门管理这些Display. 1.DisplayContent() ...