题解:    我们考虑  $ d>0 $  然后对于每一个负数  只有一次从负数到正数的变化  所以我们考虑  把每一个临界点的修改都拿出来暴力改掉  然后维护答案就行

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define link(x) for(edge *j=h[x];j;j=j->next)
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=3e5+10;
const double eps=1e-8;
#define ll long long
using namespace std;
const ll inf=2e18;
struct edge{int t;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
void add(int x,int y){o->t=y;o->next=h[x];h[x]=o++;}
ll read(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f;
}int fa[MAXN],dep[MAXN],son[MAXN],num[MAXN],n,m,a[MAXN];
void dfs1(int x,int pre,int deep){dep[x]=deep+1;fa[x]=pre;num[x]=1;link(x){if(j->t==pre)continue;dfs1(j->t,x,deep+1);num[x]+=num[j->t];if(son[x]==-1||num[son[x]]<num[j->t])son[x]=j->t;}
}int p[MAXN],fp[MAXN],cnt,tp[MAXN];
void dfs2(int x,int td){tp[x]=td;p[x]=++cnt;fp[p[x]]=x;if(son[x]!=-1)dfs2(son[x],td);link(x)if(j->t!=fa[x]&&j->t!=son[x])dfs2(j->t,j->t);
}ll maxx[MAXN<<2],Num[MAXN<<2];
ll tag[MAXN<<2],sum[MAXN<<2];
void up(int x){maxx[x]=max(maxx[x<<1],maxx[x<<1|1]);sum[x]=sum[x<<1]+sum[x<<1|1];Num[x]=Num[x<<1]+Num[x<<1|1];
}void push(int x,int l,int r){if(tag[x]){int mid=(l+r)>>1;tag[x<<1]+=tag[x];tag[x<<1|1]+=tag[x];if(maxx[x<<1]!=-inf)maxx[x<<1]+=tag[x];if(maxx[x<<1|1]!=-inf)maxx[x<<1|1]+=tag[x];sum[x<<1]+=tag[x]*(mid-l+1-2*Num[x<<1]);sum[x<<1|1]+=tag[x]*(r-mid-2*Num[x<<1|1]);tag[x]=0;}
}void built(int x,int l,int r){sum[x]=tag[x]=0;if(l==r){if(a[fp[l]]<0)Num[x]=1,maxx[x]=a[fp[l]],sum[x]=-a[fp[l]];else Num[x]=0,maxx[x]=-inf,sum[x]=a[fp[l]];return ;}int mid=(l+r)>>1;built(x<<1,l,mid);built(x<<1|1,mid+1,r);up(x);
}void update(int x,int l,int r,int t,int k){if(l==r){Num[x]=0;maxx[x]=-inf;sum[x]=k;return ;}int mid=(l+r)>>1;push(x,l,r);if(t<=mid)update(x<<1,l,mid,t,k);else update(x<<1|1,mid+1,r,t,k);up(x);
}void update1(int x,int l,int r,int ql,int qr,int t){if(ql<=l&&r<=qr){tag[x]+=t;sum[x]+=1ll*t*(r-l+1-2*Num[x]);if(maxx[x]!=-inf)maxx[x]+=t;return ;}int mid=(l+r)>>1;push(x,l,r);if(ql<=mid)update1(x<<1,l,mid,ql,qr,t);if(qr>mid)update1(x<<1|1,mid+1,r,ql,qr,t);up(x);
}ll ans;
void query(int x,int l,int r,int ql,int qr){if(ql<=l&&r<=qr){ans+=sum[x];return ;}int mid=(l+r)>>1;push(x,l,r);if(ql<=mid)query(x<<1,l,mid,ql,qr);if(qr>mid)query(x<<1|1,mid+1,r,ql,qr);up(x);
}vector<pii>vec;void query1(int x,int l,int r,int ql,int qr,int d){if(ql<=l&&r<=qr){if(maxx[x]<-d)return ;if(l==r){vec.pb(mp(l,maxx[x]));return ;}}int mid=(l+r)>>1;push(x,l,r);if(ql<=mid)query1(x<<1,l,mid,ql,qr,d);if(qr>mid)query1(x<<1|1,mid+1,r,ql,qr,d);up(x);
}void solve(int x,int y,int d){vec.clear();query1(1,1,n,x,y,d);//for(int i=0;i<vec.size();i++)cout<<vec[i].first<<":::";//cout<<endl;int l=x;for(int i=0;i<vec.size();i++){update(1,1,n,vec[i].first,d+vec[i].second);if(l<vec[i].first)update1(1,1,n,l,vec[i].first-1,d);l=vec[i].first+1;}if(l<=y)update1(1,1,n,l,y,d);
}void work1(int u,int v,int d){int uu=tp[u];int vv=tp[v];while(uu!=vv){if(dep[uu]<dep[vv])swap(uu,vv),swap(u,v);solve(p[uu],p[u],d);u=fa[uu];uu=tp[u];}if(dep[u]>dep[v])swap(u,v);solve(p[u],p[v],d);
}void work2(int u,int v){int uu=tp[u];int vv=tp[v];ll ans1=0;while(uu!=vv){if(dep[uu]<dep[vv])swap(u,v),swap(uu,vv);ans=0;query(1,1,n,p[uu],p[u]);ans1+=ans;u=fa[uu];uu=tp[u];}if(dep[u]>dep[v])swap(u,v);ans=0;query(1,1,n,p[u],p[v]);ans1+=ans;printf("%lld\n",ans1);
}int main(){n=read();m=read();inc(i,1,n)a[i]=read(),son[i]=-1;int x,y,d;inc(i,2,n)x=read(),y=read(),add(x,y),add(y,x);dfs1(1,0,0);dfs2(1,1);built(1,1,n);int op;while(m--){op=read();x=read();y=read();if(op==1)d=read(),work1(x,y,d);else work2(x,y);}return 0;
}

  

4127: Abs

Time Limit: 40 Sec  Memory Limit: 256 MB
Submit: 765  Solved: 261
[Submit][Status][Discuss]

Description

 给定一棵树,设计数据结构支持以下操作1 u v d  表示将路径 (u,v) 加d2 u v  表示询问路径 (u,v) 上点权绝对值的和

Input

第一行两个整数n和m,表示结点个数和操作数
接下来一行n个整数a_i,表示点i的权值接下来n-1行,每行两个整数u,v表示存在一条(u,v)的边接下来m行,每行一个操作,输入格式见题目描述

Output

对于每个询问输出答案

Sample Input

4 4
-4 1 5 -2
1 2
2 3
3 4
2 1 3
1 1 4 3
2 1 3
2 3 4

Sample Output

10
13
9

HINT

对于100%的数据,n,m <= 10^5 且 0<= d,|a_i|<= 10^8

转载于:https://www.cnblogs.com/wang9897/p/10432849.html

[BZOJ]4127: Abs相关推荐

  1. bzoj 4127: Abs(树链剖分+线段树)

    4127: Abs Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 667  Solved: 225 [Submit][Status][Discuss ...

  2. BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...

  3. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

  4. BZOJ.4738.[清华集训2016]汽水(点分治 分数规划)

    BZOJ UOJ 记\(val_i\)是每条边的边权,\(s\)是边权和,\(t\)是经过边数,\(k\)是给定的\(k\). 在点分治的时候二分答案\(x\),设\(|\frac st-k|=x\) ...

  5. BZOJ 4819 Luogu P3705 [SDOI2017]新生舞会 (最大费用最大流、二分、分数规划)

    现在怎么做的题都这么水了.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4819 (luogu) https://ww ...

  6. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  7. 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]

    BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1655  Solved: 798 [Submit] ...

  8. bzoj#2125. 最短路

    bzoj#2125. 最短路 题目描述 Description 给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径. Input 输入的第一行包含三个整数 ...

  9. [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】

    题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...

  10. BZOJ 2648 SJY摆棋子(KD-Tree)

    题目链接:BZOJ 2648  SJY摆棋子 题意: 在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子.此处 ...

最新文章

  1. 不盲目依赖人工智能,海信帮欧尚开了近 300 家无人便利店
  2. JavaScript语言特点
  3. python迭代器两个基本方法可供参考_浅析python迭代器和生成器
  4. MemSQL初体验 - (2)初始化测试环境
  5. 经典问题8连:小球和盒子
  6. 2018年4月蓝桥杯省赛经历
  7. Scene Graph Generation by Iterative Message Passing
  8. win7系统下C盘扩容
  9. 理工专业单身男终极把妹大法
  10. Linux高级服务搭建
  11. python在冒号处显示语法错误_python冒号错误语法无效
  12. Bugku:杂项 爆照(08067CTF)
  13. php小数点后保留一位或两位小数
  14. python随机生成小写字母表_用小写字母生成大随机字符串的最快方法
  15. VS2017运行emwin模拟机不能运行的解决部分
  16. 视频剪辑教程自学技巧:关于正确的短视频剪辑流程分享
  17. linux 查看公网ip
  18. [原创]对于运行ASP.NET程序时,提示:无法启动程序“http://localhost:3532/Default.aspx”。的解决办法...
  19. lpv4的地址格式由多少个字节组成_2020年智慧树艺术品拍卖第八单元章节测试答案...
  20. 普里姆 克鲁斯卡尔算法

热门文章

  1. 服务器真在运行中,win7电脑服务器正在运行中的解决教程
  2. linux php oauth安装,Linux安装phpmyadmin
  3. 西北农林科技大学计算机考研难吗,西北农林科技大学考研难吗?一般要什么水平才可以进入?...
  4. python动态创建对象属性_Python学习笔记——动态添加属性与方法
  5. java并发编程(1)--线程 可见性 volatile怎么用
  6. Instantiation of Chaincode using Fabric Node manifest for hyperledger/fabric-ccenv:latest not found
  7. Kubernetes 小白学习笔记(27)--kubernetes的运维-Trouble Shooting方法
  8. ubuntu 时间戳不对
  9. ajax怎么在服务器返回值,node.js+Ajax实现获取HTTP服务器返回数据?
  10. java 缓存ech_java ehcache 分布式缓存配置实例 .