本主题开始看到以为段树或树状数组,但是,对于一个节点的有疑问的所有子节点的加权,这一条件被视为树的根,像 然后1号是肯定在第一层中,然后建立一个单向侧倒查,然后记录下来 其中每个节点 层,终于 两个节点 之间的差 图层知道,上easy加权成交,然后,我们开始建立的数组,一直爆错,后来发现 是范围有问题,这样直接建立是错的,由于不知道详细范围,数字太大了。 所以參考了一下

http://blog.csdn.net/keshuai19940722/article/details/20128965

厉害啊。我想不到。原来能够建立两个树状数组,然后 在深搜找出节点所在层的同一时候 也记录一下 它的时间戳,也就是这个节点第一次被訪问到的作为一个记录和的树状数组下标。以及往下找子节点回溯回来的这个时间错 建立还有一个记录要减去的和的树状数组下标,这样范围就确定了,可是这样无法直接加权,要对 第一次訪问到的 加权 然后对 回溯的 进行相同的值的 负值加权,同一时候加权的时候 直接所有都加上去。不考虑节点与此时父节点相差层数,仅仅考虑与根的,然后 这样是多加了的。这时候 能够把要减去的 给算好,最后一起减去就能够了,要减去的
就直接加上 k,最后一起算的时候 再乘上与根 相差层数,两个树状数组都以与主根 相差层数为基准。这样 就能够了

然后这个取余不知道怎么了。一直WA,后来我手写了一个 MODE函数才过,原来直接取模 我也考虑了负数 要多加一个MOD可是 还是WA,为什么别人能够 我就不行了 郁闷

#define MOD 1000000007

int n,tot;

int vis[300000 + 55];

int le[300000 + 55],ri[300000 + 55];

ll ad[300000 + 55],sub[300000 + 55];

vector<int > G[300000 + 55];

void init() {
for(int i=0;i<300000 + 55;i++)G[i].clear();
memset(vis,0,sizeof(vis));
memset(ad,0,sizeof(ad));
memset(sub,0,sizeof(sub));
memset(le,0,sizeof(le));
memset(ri,0,sizeof(ri));
tot = 0;
} bool input() {
while(cin>>n) {
for(int i=2;i<=n;i++) {
int x;
scanf("%d",&x);
G[x].push_back(i);
}
return false;
}
return true;
} void dfs(int u,int cnt) {
tot++;
le[u] = tot;
for(int i=0;i<G[u].size();i++) {
int v = G[u][i];
dfs(v,cnt + 1);
}
vis[u] = cnt;
ri[u] = tot;
} ll MODE(ll x) {
if(x >= MOD)x %= MOD;
else if(x < 0ll)x = (x + MOD)%MOD;
return x;
} int lowbit(int x) {
return x&(-x);
} void add1(int i, ll val) {
while (i <= tot) {
ad[i] += val;
ad[i] = MODE(ad[i]);
i += lowbit(i);
}
} void add2(int i,ll val) {
while(i <= tot) {
sub[i] += val;
sub[i] = MODE(sub[i]);
i += lowbit(i);
}
} ll get_sum1(int i) {
ll sum = 0;
while (i > 0) {
sum += ad[i];
sum = MODE(sum);
i -= lowbit(i);
}
return sum;
} ll get_sum2(int i) {
ll sum = 0ll;
while(i > 0) {
sum += sub[i];
sum = MODE(sum);
i -= lowbit(i);
}
return sum;
} void cal() {
dfs(1,0);
int q;
cin>>q;
while(q--) {
int type;
scanf("%d",&type);
if(type == 1) {
int v;
ll x,k;
scanf("%d %I64d %I64d",&v,&x,&k); x = (x + (vis[v] - 1) * k)%MOD; add1(le[v],x);
add1(ri[v] + 1,-x); add2(le[v],k);
add2(ri[v] + 1,-k);
}
else {
int v;
scanf("%d",&v);
ll xx = get_sum1(le[v]);
ll yy = get_sum2(le[v]);
ll ans = MODE(xx - MODE((vis[v] - 1) * yy));
printf("%I64d\n",ans);
}
}
} void output() { } int main() {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

CodeForces 396C 树状数组 + DFS的更多相关文章

  1. 【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序

    [题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...

  2. codeforces 570 D. Tree Requests 树状数组+dfs搜索序

    链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...

  3. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  4. 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序

    3881: [Coci2015]Divljak Time Limit: 20 Sec  Memory Limit: 768 MBSubmit: 508  Solved: 158[Submit][Sta ...

  5. HDU 3333 | Codeforces 703D 树状数组、离散化

    HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...

  6. 【BZOJ-1103】大都市meg 树状数组 + DFS序

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2009  Solved: 1056[Submit][Sta ...

  7. POJ 3321 Apple Tree (树状数组+dfs序)

    题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...

  8. BZOJ 1103 [POI2007]大都市meg(树状数组+dfs序)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1103 [题目大意] 给出一棵树,每条边的经过代价为1,现在告诉你有些路不需要代价了, ...

  9. [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]

    题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...

随机推荐

  1. 自己定义 ViewGroup 支持无限循环翻页之三(响应回调事件)

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处,再次感谢 ################################ ...

  2. Mit 分布式系统导论,Distributed Systems ,lab1 -lab6 总结,实验一到实验六总结

    终于把Mit的分布式系统导论课的实验1-6写完了 做得有些痛苦,但是收获也很大 http://pdos.csail.mit.edu/6.824-2012/labs/index.html 把实验1-6用 ...

  3. MySQL外键约束OnDelete和OnUpdate的使用

    On Delete和On Update都有Restrict,No Action, Cascade,Set Null属性.现在分别对他们的属性含义做个解释. ON DELETE restrict(约束) ...

  4. 安装pygame

    pygame的安装 我们首先要去到:http://www.pygame.org/download.shtml 下载我们所需要的软件包: 我选择的是:pygame-1.9.2a0.win32-py3.2 ...

  5. CentOS 6.5安全加固及性能优化

    (文章来自:http://www.cnblogs.com/seasonzone/p/3526296.html) 我们可以通过调整系统参数来提高系统内存.CPU.内核资源的占用,通过禁用不必要的服务.端 ...

  6. 在配置文件(.settings、.config)中存储自定义对象

    原文:在配置文件(.settings..config)中存储自定义对象 引言 我前面曾写过一篇<使用配置文件(.settings..config)存储应用程序配置>,我在其中指出“sett ...

  7. 【Oracle】物理体系结构

     一.ORACLE 物理体系结构 原理结构图 各部分解释: PGA: 私有内存区,仅供当前发起用户使用. 三个作用 用户登录后的session信息会保存在PGA. 运行排序.假设内存不够,orac ...

  8. 队列优化和斜率优化的dp

    可以用队列优化或斜率优化的dp这一类的问题为 1D/1D一类问题 即状态数是O(n),决策数也是O(n) 单调队列优化 我们来看这样一个问题:一个含有n项的数列(n<=2000000),求出每一 ...

  9. 期望dp专题

    一直不明白为什么概率是正推,期望是逆推. 现在题目做多了,慢慢好像有点明白了 poj2096 收集bug,  有n个种类的bug,和s个子系统.  每找到一个bug需要一天. 要我我们求找到n个种类的 ...

  10. 动态加载资源文件(ResourceDictionary)

    原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式: 1.在项目的启动文件App中<App ...