意甲冠军:

特定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的更多相关文章

  1. 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 ...

  2. Hdu 5052 Yaoge’s maximum profit(树链剖分)

    题目大意: 给出一棵树.每一个点有商店.每一个商店都有一个价格,Yaoge每次从x走到y都能够在一个倒卖商品,从中得取利益.当然,买一顶要在卖之前.可是没次走过一条路,这条路上的全部商品都会添加一个v ...

  3. 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 ...

  4. 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, ...

  5. 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 ...

  6. HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)

    思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’   'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...

  7. 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 ...

  8. 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 ...

  9. 2014 ACM/ICPC Asia Regional Xi'an Online(HDU 5007 ~ HDU 5017)

    题目链接 A题:(字符串查找,水题) 题意 :输入字符串,如果字符串中包含“ Apple”, “iPhone”, “iPod”, “iPad” 就输出 “MAI MAI MAI!”,如果出现 “Son ...

随机推荐

  1. sql server事物控制

    一.多个数据库 1.存储过程 2.Commit写在 Try...Catch后面 protected void Button1_Click(object sender, EventArgs e)    ...

  2. IOS_多线程_ASI_AFN_UIWebView

    H:/0730/00_多线程4票种_ViewController.h // // ViewController.h // 卖票 // // Created by apple on 13-7-29. / ...

  3. Linux下安装Oracle11g服务器(转)

    安装环境 Linux服务器:SuSe10 sp2 64位 Oracle服务器:Oracle11gR2 64位 系统要求 Linux安装Oracle系统要求 系统要求 说明 内存 必须高于1G的物理内存 ...

  4. JavaScript向select下拉框中加入和删除元素

    JavaScript向select下拉框中加入和删除元素 1.说明 a   利用append()方法向下拉框中加入元素 b   利用remove()方法移除下拉框中最后一个元素 2.设计源代码 < ...

  5. 局部敏感哈希(Locality-Sensitive Hashing, LSH)方法介绍

    局部敏感哈希(Locality-Sensitive Hashing, LSH)方法介绍 本文主要介绍一种用于海量高维数据的近似近期邻高速查找技术--局部敏感哈希(Locality-Sensitive ...

  6. J Dp

    <span style="color:#000099;">/* ____________________________________________________ ...

  7. NodeJS常用模块介绍

    收集了NodeJS开发中常用的一些模块. MVC框架 - Express Express 是轻量灵活的Nodejs Web应用框架,它可以快速地搭建网站.Express框架建立在Nodejs内置的Ht ...

  8. Linux的proc文件系统

    proc,用户空间和内核空间能够通过该接口通信, 与普通文件不同的是.这些虚拟文件的内容都是动态创建的. proc文件系统是一个伪文件系统,它仅仅存在内存其中,而不占用外存空间. 它以文件系统的方式为 ...

  9. Redis源代码分析(23)--- CRC循环冗余算法RAND随机数的算法

    他今天就开始学习Redis源代码的一些工具来实现,在任何一种语言工具.算法实现的原理应该是相同的,一些比較经典的算法.比方说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循 ...

  10. Linux lspci查看硬件设备

    Linux 主机的硬件配备 lspci 找到的是眼下主机上面的硬件配备 [root@www ~]# lspci [-vvn] 选项与參数: -v     :显示很多其它的 PCI 接口装置的具体信息 ...