意甲冠军:

特定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. Socket的错误码和描述(中英文翻译)

    Socket的错误码和描述(中英文翻译) //下面是Socket Error的错误码和描述: Socket error 0 - Directly send error  Socket error 10 ...

  2. DeviceIoControl 直接从磁盘扇区读文件

    好久没写博客了,近期看了下DeviceIoControl  关于磁盘的应用,特记一文,以备久后查阅. 首先介绍下,文件在磁盘的存储结构(详细能够到网上查询NTFS文件系统相关的教程后者数据恢复方面教程 ...

  3. sql 与linq的转换

    1. left Join 原始sql select t.[MINTAccountIdentifier] from BSS_Tenant t left join BL_SAPCustomer s on ...

  4. Linux curl使用简单介绍 (转)

    Curl是Linux下一个很强大的http命令行工具,其功能十分强大. 1) 二话不说,先从这里开始吧! $ curl http://www.linuxidc.com 回车之后,www.linuxid ...

  5. UVA - 12338 Anti-Rhyme Pairs (哈希)

    Description D Anti-Rhyme Pairs Input: Standard Input Output: Standard Output Often two words that rh ...

  6. 开源NetWorkSocket通讯组件

    开源NetWorkSocket通讯组件   前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经 ...

  7. NEON简单介绍

    个128位四字寄存器Q0-Q15,32个64位双字寄存器D0-D31,两个寄存器是重叠的,在使用的时候须要特别注意,不小心就会被覆盖掉. NEON的数据类型:无符号整数.有符号整数.未指定类型的整数. ...

  8. Android利用网络编程HttpClient批量上传(一个)

    请尊重他人的劳动成果.转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP訪问网络资源>一文中介绍过HttpCient ...

  9. 文件搜索神器everything 你不知道的技巧总结

    everything这个软件用了很久,总结了一些大家可能没注意到的技巧,分享给大家 1.指定文件目录搜索示例: TDDOWNLOAD\ abc        在所有TDDOWNLOAD文件夹下搜索包含 ...

  10. opencv2对于读书笔记——背投影图像的直方图来检测待处理的内容

    一些小的概念 1.直方图是图像内容的一个重要特性. 2.假设一幅图像的区域中显示的是一种独特的纹理或是一个独特的物体,那么这个区域的直方图能够看作是一个概率函数,它给出的是某个像素属于该纹理或物体的概 ...