题目链接:

F - Change

FZU - 2277

题目大意:

题意: 给定一棵根为1, n个结点的树. 有q个操作,有两种不同的操作

(1) 1 v k x : a[v] += x, a[v '] += x – k(v '为v的儿子), a[v ' '] += x – 2 * k(v ' '是v '的儿子) ... ;

(2) 2 v : 输出a[v] % (1e9 + 7);

具体思路:dfs序+线段树

a[v'']=a[v'']+x-k*(depth[v'']-depth[v])=a[v'']+x-k*depth[v"]+k*depth[v]=(a[v"]+k*depth[v]) - k*depth[v""].

第一个括号里面用一个线段树维护,第二个括号里面用另一个线段树维护就可以了。

具体求值的时候:对于一次增加操作,节点x增加的值其实就是x-(deep[x]-deep[v])*k。(deep[v]为该次修改的根节点)。

AC代码:

 #include<iostream>
#include<stdio.h>
#include<vector>
#include<cstring>
using namespace std;
# define ll long long
# define lson l,mid,rt<<
# define rson mid+,r,rt<<|
const int maxn = 3e5+;
const int mod =1e9+;
ll tree1[maxn<<],tree2[maxn<<];
int dfsord,n;
vector<int>edge[maxn];
int st[maxn],ed[maxn],depth[maxn];
int Scan()
{
int res = , ch, flag = ;
if((ch = getchar()) == '-')
flag = ;
else if(ch >= '' && ch <= '')
res = ch - '';
while((ch = getchar()) >= '' && ch <= '' )
res = res * + ch - '';
return flag ? -res : res;
} ll Scan_l()
{
ll res = ;
int ch, flag = ;
if((ch = getchar()) == '-')
flag = ;
else if(ch >= '' && ch <= '')
res = ch - '';
while((ch = getchar()) >= '' && ch <= '' )
res = res * + ch - '';
return flag ? -res : res;
}
void init()
{
for(int i=; i<n; i++)
{
edge[i].clear();
}
dfsord=;
memset(tree1,,sizeof(tree1));
memset(tree2,,sizeof(tree2));
}
void dfs(int cur,int fa,int dep)
{
st[cur]=ed[cur]=++dfsord;
depth[dfsord]=dep+;
for(int i=; i<edge[cur].size(); i++)
{
int to=edge[cur][i];
if(to==fa)
continue;
dfs(to,cur,dep+);
}
ed[cur]=dfsord;
}
void down(int rt)
{
tree1[rt<<]=(tree1[rt<<]+tree1[rt]+mod)%mod;
tree1[rt<<|]=(tree1[rt<<|]+tree1[rt]+mod)%mod;
tree2[rt<<]=(tree2[rt<<]+tree2[rt]+mod)%mod;
tree2[rt<<|]=(tree2[rt<<|]+tree2[rt]+mod)%mod;
tree1[rt]=,tree2[rt]=;
}
void update(int l,int r,int rt,int L,int R,ll val1,ll val2)
{
if(L<=l&&R>=r)
{
tree1[rt]=(tree1[rt]+val1+mod)%mod;
tree2[rt]=(tree2[rt]+val2+mod)%mod;
return ;
}
down(rt);
int mid=(l+r)>>;
if(L<=mid)
update(lson,L,R,val1,val2);
if(R>mid)
update(rson,L,R,val1,val2);
}
ll ask(int l,int r,int rt,int pos)
{
if(l==r)
{
return (tree1[rt]+tree2[rt]*depth[pos]%mod+mod)%mod;
}
int mid=(l+r)>>;
down(rt);
if(pos<=mid)
return ask(lson,pos);
else
return ask(rson,pos);
}
int main()
{
int T,tmp;
T=Scan();
while(T--)
{
n=Scan();
init();
for(int i=; i<=n; i++)
{
tmp=Scan();
edge[tmp].push_back(i);
}
int m;
dfs(,,);
m=Scan();
while(m--)
{
int op,v;
ll x,k;
op=Scan();
if(op==)
{
v=Scan();
x=Scan_l();
k=Scan_l();
update(,n,,st[v],ed[v],x+k*depth[st[v]],-k);
}
else
{
v=Scan();
ll ans=ask(,n,,st[v]);
ans=(ans%mod+mod)%mod;
printf("%lld\n",ans);
}
}
}
return ;
}

F - Change FZU - 2277 (DFS序+线段树)的更多相关文章

  1. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

  2. BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树

    题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...

  3. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  4. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  5. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  6. CodeForces 877E Danil and a Part-time Job(dfs序+线段树)

    Danil decided to earn some money, so he had found a part-time job. The interview have went well, so ...

  7. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...

  8. 【cf343】D. Water Tree(dfs序+线段树)

    传送门 题意: 给出一个以\(1\)为根的有根树,起始每个结点都为\(0\),现在有三种操作: 1.将\(v\)及\(v\)的子树都置为\(1\): 2.将\(v\)及其所有的祖先都置为\(0\): ...

  9. BZOJ 3252题解(贪心+dfs序+线段树)

    题面 传送门 分析 此题做法很多,树形DP,DFS序+线段树,树链剖分都可以做 这里给出DFS序+线段树的代码 我们用线段树维护到根节点路径上节点权值之和的最大值,以及取到最大值的节点编号x 每次从根 ...

随机推荐

  1. Hibernate3 多对多关系

    学习hibernate的笔迹第三篇,主要内容:多对多关系, 检索策略,HQL查询,QBC,事物管理,c3p0配置 1.1.1  Hibernate的关联关系映射:(多对多) 1.1.1.1     多 ...

  2. Educational Codeforces Round 55 (Rated for Div. 2) B. Vova and Trophies

    传送门 https://www.cnblogs.com/violet-acmer/p/10035971.html 题意: Vova有n个奖杯,这n个奖杯全部是金奖或银奖,Vova将所有奖杯排成一排,你 ...

  3. This Gradle plugin requires a newer IDE able to request IDE model level 3. For Android Studio this means v3+

    在项目的gradle.properties配置文件中加入以下这句: gradle.properties中:android.injected.build.model.only.versioned = 3

  4. (进制转换 栈)P1143 进制转换 洛谷

    题目描述 请你编一程序实现两种不同进制之间的数据转换. 输入输出格式 输入格式: 共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10n> ...

  5. 你一直在找的 Mac 系统优化工具,可能就是这一款!

    文章来源:知乎 文章收录于:风云社区 www.scoee.com,提供上千款各类mac软件下载 尽管 Mac 上的维护工具总会被人诟病(通常是那些极客),但对于普通用户来说,像 CleanMyMac. ...

  6. Go-day05

    今日概要: 1. 结构体和方法 2. 接口 一.go中的struct 1. 用来自定义复杂数据结构 2. struct里面可以包含多个字段(属性) 3. struct类型可以定义方法,注意和函数的区分 ...

  7. Shiro中session超时页面跳转的处理

    问题描述 shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时. 本文从这两个方面分别考虑并处理. ajax请 ...

  8. 2017-12-18python全栈9期第三天第二节之str常用操作方法及for循环之判断字母数字组成

    #!/user/bin/python# -*- coding:utf-8 -*-name = 'zd123'print(name.isalnum()) #由数字或字母组成print(name.isal ...

  9. docker 基础之数据管理

    数据卷 一.将本地默认目录挂载到docker容器内指定的目录 #将本地的目录挂在到docker容器内 docker run -it --name container-test -h CONTAINER ...

  10. 安装saltstack使用的shell

    sed -i 's/^#//g'  /etc/yum.repos.d/centos6.8.repo sed -i 's/enabled=0/enabled=1/g'  /etc/yum.repos.d ...