Description
一棵有向树,1是根,每个点有点权,两种操作:
Q u:查询u节点为根节点的子树中权值最大值与最小值的差
R u x:给以u节点为根节点的子树所有点点权加上x
Input
第一行一整数T表示用例组数,每组用例首先输入一整数n表示点数,之后n-1个数,第i个数表示i+1点的父亲节点,之后n个数c[i]表示每个点的点权,然后输入一整数q表示操作数,最后q行每行一种操作
(2<=n<=1e6,1<=m<=1e4,1<=c[i]<=1e3,1<=x<=1e3)
Output
对于每次查询操作,输出结果
Sample Input
1
5
1 1 2 2
10 6 8 4 5
7
Q 2
Q 3
R 4 2
Q 2
Q 1
R 2 4
Q 1
Sample Output
2
0
1
5
2
Solution
求出每个点的dfs序后,两种操作分别变成查询区间最大值最小值以及区间更新,线段树即可
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 1111111
int T,n,q,ll[maxn],rr[maxn],index;
vector<int>g[maxn];
void dfs(int u)
{ll[u]=++index;for(int i=0;i<g[u].size();i++)dfs(g[u][i]);rr[u]=index;
}
#define ls (t<<1)
#define rs ((t<<1)|1)
int Max[maxn<<2],Min[maxn<<2],Plus[maxn<<2];
void build(int l,int r,int t)
{Max[t]=Min[t]=Plus[t]=0;if(l==r)return ;int mid=(l+r)>>1;build(l,mid,ls),build(mid+1,r,rs);
}
void push_up(int t)
{Max[t]=max(Max[ls],Max[rs]);Min[t]=min(Min[ls],Min[rs]);
}
void push_down(int t)
{if(Plus[t]){int tt=Plus[t];Plus[t]=0;Max[ls]+=tt,Min[ls]+=tt,Plus[ls]+=tt;Max[rs]+=tt,Min[rs]+=tt,Plus[rs]+=tt;}
}
void update(int L,int R,int l,int r,int t,int v)
{if(L<=l&&r<=R){Min[t]+=v,Max[t]+=v,Plus[t]+=v;return ;}push_down(t);int mid=(l+r)>>1;if(L<=mid)update(L,R,l,mid,ls,v);if(R>mid) update(L,R,mid+1,r,rs,v);push_up(t);
}
int query_max(int L,int R,int l,int r,int t)
{if(L<=l&&r<=R)return Max[t];push_down(t);int ans=0;int mid=(l+r)>>1;if(L<=mid)ans=max(ans,query_max(L,R,l,mid,ls));if(R>mid)ans=max(ans,query_max(L,R,mid+1,r,rs));return ans;
}
int query_min(int L,int R,int l,int r,int t)
{if(L<=l&&r<=R)return Min[t];push_down(t);int ans=INF;int mid=(l+r)>>1;if(L<=mid)ans=min(ans,query_min(L,R,l,mid,ls));if(R>mid)ans=min(ans,query_min(L,R,mid+1,r,rs));return ans;
}
int main()
{scanf("%d",&T);while(T--){scanf("%d",&n);index=0;for(int i=1;i<=n;i++)g[i].clear();for(int i=1;i<n;i++){int fa;scanf("%d",&fa);g[fa].push_back(i+1);}dfs(1);build(1,n,1);for(int i=1;i<=n;i++){int c;scanf("%d",&c);update(ll[i],ll[i],1,n,1,c);}scanf("%d",&q);while(q--){char op[3];int x,c;scanf("%s",op);if(op[0]=='Q'){scanf("%d",&x);printf("%d\n",query_max(ll[x],rr[x],1,n,1)-query_min(ll[x],rr[x],1,n,1));}else{scanf("%d%d",&x,&c);update(ll[x],rr[x],1,n,1,c);}}}return 0;
}

GYM 100827 I.Salary Inequity(线段树)相关推荐

  1. Joy of Handcraft Gym - 102822J(线段树或差分)

    Joy of Handcraft Gym - 102822J 题意: 每个灯有亮的周期和亮度,问1~m这段时间灯光最亮是多少 题解: 线段树维护区间最大值 根据灯的周期向这段区间加亮度k,然后利用线段 ...

  2. Gym - 101889I Imperial roads(最小生成树+树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一个由n个节点组成的无向图,现在给出m次询问,每次询问给出一组u和v,问若使用u-v这条边所能组成的最小生成树的权值是多少 题目分析:题意描述的很清楚,但当然不能直接 ...

  3. 【Gym - 101608G】WiFi Password (区间或,线段树 或 按位处理+尺取 或 二分)

    题干: Just days before the JCPC, your internet service went down. You decided to continue your trainin ...

  4. Gym - 102174G 神圣的 F2 连接着我们 (线段树优化建图 + 多源最短路)

    Description 小白非常喜欢玩 "县际争霸" 这款游戏,虽然他的技术并不容乐观."县际争霸" 的地图共有两个县,每个县里各有 n n n 个据点.同一个 ...

  5. Jittery Roads Gym - 100889J (虚树 + DP + dfs 序, + 线段树)

    每次给一个点集, 求每个点到其他所有点的最大距离: 会修改边权; 修改边权之后, 我们可以用 dfs 序 + 线段树维护 当前点到根节点的距离. 还可以用树状数组 + 差分思想 维护. { dfs 序 ...

  6. Gym - 101194G Pandaria (并查集+倍增+线段树合并)

    题意: 给定一个无向图.每个点有一种颜色.现在给定q个询问,每次询问x和w,求所有能通过边权值不超过w的边走到x的点的集合中,哪一种颜色的点出现的次数最多.次数相同时输出编号最小的那个颜色.强制在线. ...

  7. Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)

    题目链接  2016 ACM-ICPC EC-Final Problem G 题意  给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...

  8. 【BZOJ】1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚(dp/线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1672 dp很好想,但是是n^2的..但是可以水过..(5s啊..) 按左端点排序后 f[i]表示取第 ...

  9. 2021CCPC(桂林) - Suffix Automaton(后缀树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,再给出 qqq 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置.如果有多个答案,输出起点最小的那个. 本题规定字符串大小 ...

最新文章

  1. R语言数据排序函数sort, order rank实战
  2. 怎么修改云服务器项目路径,云服务器tomcat的项目路径怎么设置
  3. EditText获取焦点并自动弹出软键盘
  4. 查看mysql用户权限_mysql 如何查看该数据库用户具有哪些权限?
  5. C#中数组、ArrayList和List三者的区别(转) ,加修改
  6. ()IT 职场经验)一位10年Java工作经验的架构师的经验分享,感觉很受用。
  7. 【NOIP2017】【Luogu3955】图书管理员(枚举,取模得后缀)
  8. 《LeetBook》LeetCode题解(1) : Two Sum[E]——哈希Map的应用
  9. 20180104 wdcp中的mysql重启不成功
  10. Js打印object对象两种方法
  11. android keytool工具,keytool工具的使用
  12. 联想小新air13装双系统_联想小新Pro 13黑苹果详细安装教程
  13. mvvm框架 android,mvvm框架原理 android 怎么使用mvvm框架
  14. Drupal 7 自定义页面如何向自定义的主题传参
  15. 多个分析视角的数据多维分析图表该如何制作?
  16. 短址(short URL)原理及其实现 来源:http://blog.csdn.net/beiyeqingteng
  17. HTML5网页设计基础——精美电商悬浮窗
  18. 计算机发展历史的感想
  19. 谷歌生物医学专用翻译_一个可以快速翻译浏览英文文献的工具,拿走不谢!
  20. 边缘计算网关是什么?有什么功能和特点?

热门文章

  1. 卷积神经网络架构不包含,卷积神经网络架构分析
  2. 虚拟IP注册Nacos的问题
  3. 一种灵活可靠的工作方式:组件化设计与开发
  4. [OpenGL] Bloom自发光效果
  5. 中大新华计算机科学与技术,专业评估|信息科学学院电子信息科学与技术、计算机科学与技术、软件工程、数字媒体技术专业评估考察会议举行...
  6. 抗混叠滤波器 - 差分输入ADC的前端抗混叠RC滤波器设计实现
  7. 软文营销文案兼具有趣的灵魂才能形成广泛传播
  8. 冲激响应不变法或双线性变换法中的参数T为什么是一个无关紧要的参数
  9. 拉格朗日插值、分段线性插值、三次样条插值
  10. PS做以图片为文字背景