Codeforces 396C
题意略。
思路:
将树上的节点编好dfs序,然后就可以用树状数组区间修改点查询了。
我们用 lft[v] 和 rht[v]来表示v的子树在dfs序中的左端和右端,这样才方便我们对树状数组的操作。
其实这个题目的问题在于每个点在修改时,修改的值不是一定的,会发生变化。
我是将加上的值和减去的值分开了。
开两个树状数组,一个记录加:在我们进行加操作的时候,加上的值是x + deep[v] * k。
一个记录减:在我们进行减操作的时候,减去的值就是k。
最后在获取答案的时候,ans = sum(v,0) - deep[v] * sum(v,1)。
详见代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 3e5 + ;
const LL mod = 1e9 + ; int lft[maxn],rht[maxn],n,q,cnt;
LL deep[maxn],BIT[][maxn];
vector<int> graph[maxn]; void dfs(int cur,int d){
lft[cur] = ++cnt;
deep[cur] = d;
for(int i = ;i < graph[cur].size();++i){
int v = graph[cur][i];
dfs(v,d + );
}
rht[cur] = cnt;
}
int lowbit(int k){
return (k & -k);
}
void add(int pos,LL val,int idx){
while(pos <= n){
BIT[idx][pos] += val;
BIT[idx][pos] %= mod;
pos += lowbit(pos);
}
}
LL sum(int pos,int idx){
LL ret = ;
while(pos > ){
ret += BIT[idx][pos];
pos -= lowbit(pos);
ret %= mod;
}
return ret;
} int main(){
scanf("%d",&n);
int pi;
for(int i = ;i <= n;++i){
scanf("%d",&pi);
graph[pi].push_back(i);
}
dfs(,);
scanf("%d",&q);
for(int i = ;i < q;++i){
int type;
scanf("%d",&type);
if(type == ){
int v;
LL x,k;
scanf("%d%lld%lld",&v,&x,&k);
LL val = (x + deep[v] * k) % mod;
add(lft[v],val,);
add(rht[v] + ,-val,);
add(lft[v],k,);
add(rht[v] + ,-k,);
}
else{
int v;
scanf("%d",&v);
int pos = lft[v];
LL part1 = sum(pos,);
LL part2 = sum(pos,);
part2 = part2 * deep[v] % mod;
LL ans = ((part1 - part2) % mod + mod) % mod;
printf("%lld\n",ans);
}
}
return ;
}
Codeforces 396C的更多相关文章
- CodeForces 396C On Changing Tree
On Changing Tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...
- CodeForces 396C 树状数组 + DFS
本主题开始看到以为段树或树状数组,但是,对于一个节点的有疑问的所有子节点的加权,这一条件被视为树的根,像 然后1号是肯定在第一层中,然后建立一个单向侧倒查,然后记录下来 其中每个节点 层,终于 两个节 ...
- CodeForces - 396C On Changing Tree(树状数组)
题目大意 给定一棵以1为根的树,初始时所有点为0 给出树的方式是从节点2开始给出每一个点的父亲 然后是 $m$ 次操作,分为两种 $1 v,k,x$ 表示在以v为根的子树中的每一个点上添加 $x-i* ...
- Codeforces 396C (DFS序+线段树)
题面 传送门 题目大意: 给定一棵树,每个点都有权值,边的长度均为1,有两种操作 操作1:将节点u的值增加x,并且对于u的子树中的任意一个点v,将它的值增加x-dist(u,v)*k, dist(u, ...
- CDQ分治题目小结
CDQ分治属于比较特殊的一类分治,许多问题转化为这类分治的时候,时空方面都会有很大节省,而且写起来没有这么麻烦. 这类分治的特殊性在于分治的左右两部分的合并,作用两部分在合并的时候作用是不同的,比如, ...
- CQD(陈丹琦)分治 & 整体二分——专题小结
整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料: 整体二分是个很神的东西 ...
- codeforces396C
On Changing Tree CodeForces - 396C You are given a rooted tree consisting of n vertices numbered fro ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
随机推荐
- django第一次(转自刘江大佬)
下面的模型定义了一个“人”,它具有first_name和last_name字段: from django.db import models class Person(models.Model): fi ...
- C#汽车租赁系统 完整版
Truck.cs类 //卡车类 public class Truck : Vehicle1 { //重载 public int Load { get; set; } //构造函数 public T ...
- Prometheus 整合 AlertManager
简介 Alertmanager 主要用于接收 Prometheus 发送的告警信息,它很容易做到告警信息的去重,降噪,分组,策略路由,是一款前卫的告警通知系统.它支持丰富的告警通知渠道,可以将告警信息 ...
- 「Azure」数据分析师有理由爱Azure之一-Azure能带给我们什么?
前面我们以相同的方式从数据分析师的视角介绍了Sqlserver,本系列亦同样地延续下去,同样是挖掘数据分析师值得使用的Azure云平台的功能.因云平台功能太多,笔者所接触的面也十分有限,有更专业的读者 ...
- Android开发——通过wifi接收IPCamera视频流
前面,我们已经了解了怎么在android app上打开关闭和扫描,搜索wifi,现在,我来写一下怎么通过连接wifi来使app获取到IPCamera摄像头的视频. 一.通过URL获取视频的地址 二.创 ...
- 在线图片base64编码
图片Base64编码https://oktools.net/image2base64 在线工具https://oktools.net JSON格式化https://oktools.net/json U ...
- bucket list 函数解析
cls_bucket_list 函数 librados::IoCtx index_ctx; // key - oid (for different shards if there is any) ...
- Spark 系列(七)—— 基于 ZooKeeper 搭建 Spark 高可用集群
一.集群规划 这里搭建一个 3 节点的 Spark 集群,其中三台主机上均部署 Worker 服务.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoop0 ...
- HTML/CSS:display:flex 布局教程
网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...
- ccf 201903-5 317号子任务(60分)
看到这题,第一印象,用dijkstra算法求n次单源最短路,时间复杂度O(n^3),超时30分妥妥的. 于是用优先队列优化,O(n*mlogm),快很多,但依然30. 那么不妨换一种思路,题目要求的是 ...