博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj4034: [HAOI2015]树上操作
阅读量:5073 次
发布时间:2019-06-12

本文共 1571 字,大约阅读时间需要 5 分钟。

这题其实就是树剖裸题啊。

然后毒瘤选手由于上题树剖被卡到哭所以选择dfs序+树状数组。

不得不说简单的算法做出来更加难思考。然后网上的dalao们都一笔带过净说什么用两个树状数组维护就可以啦。

经过大半小时的思考,代码实现还是非常简单。

这个值得详细讲讲。

 

假如我们弄一个树状数组,然后维护的是x到根的sum(其实就是询问的答案嘛),先看第一个操作,单点修改,那么改了这个点,相当于把他这一整棵子树的答案都加上了d,由于用dfs序重新编号,可以发现子树中的点都是连续的,那么树状数组改段求段就可以用差分数组解决。

问题在于第二个操作,修改了整个子树,对每个节点y的影响是d*(dep[x]-dep[y]),那么非常难受,因为每个点改变的值和dep有关,并不相同,怎么办?绝佳的方法就是我们忽略dep的影响,用另一个树状数组维护d,那么问题又来了,x肯定不是时时相同的,虽然询问y的时候可以知道dep[y],但是dep[x]仍然不确定,为了可以确定,那么对于每次这种修改,我们就在第一个树状数组给它减去d*(dep[x]-1),这样一来,就把这个操作转化成增加x整个子树和x到根的路径上的点,那么对于每个点,增加的数就变成d*dep[y],那么求解的时候,就可以心安理得的用第一个树状数组的值+第二个树状数组的值*d了。

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;int n,m;struct node{ int x,y,next;}a[210000];int len,last[110000];void ins(int x,int y){ len++; a[len].x=x;a[len].y=y; a[len].next=last[x];last[x]=len;}int z,dep[110000],l[110000],r[110000];void dfs(int x,int f){ l[x]=++z; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(y!=f) dep[y]=dep[x]+1, dfs(y,x); } r[x]=z;}//---------init-----------------LL s[2][110000];int lowbit(int x){ return x&-x;}void change(int w,int x,LL k){ while(x<=n) { s[w][x]+=k; x+=lowbit(x); }}LL getsum(int w,int x){ LL ret=0; while(x>=1) { ret+=s[w][x]; x-=lowbit(x); } return ret;}//-----------bit--------------LL point[110000];int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%lld",&point[i]); len=0;memset(last,0,sizeof(last)); int x,y; for(int i=1;i

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/8490480.html

你可能感兴趣的文章
[转]使用 Razor 进行递归操作
查看>>
[转]Android xxx is not translated in yyy, zzz 的解决方法
查看>>
docker入门
查看>>
Android系统--输入系统(十一)Reader线程_简单处理
查看>>
监督学习模型分类 生成模型vs判别模型 概率模型vs非概率模型 参数模型vs非参数模型...
查看>>
Mobiscroll脚本破解,去除Trial和注册时间限制【转】
查看>>
实验五 Java网络编程及安全
查看>>
32位与64位 兼容编程
查看>>
[数据库]关于三个比较典型的数据库试题(1.找到员工表中工资最高的前三名;2.找到员工表中薪水大于本部门平均薪水的员工;3.统计每年入职的员工个数)...
查看>>
iOS-数据解析XML解析的多种平台介绍
查看>>
自考心得
查看>>
基于PaaS人事部门间平台多重身份的技术解决方案
查看>>
写的好帮手项目官员 - Evernote 5.4(Evernote的) 中国绿色版
查看>>
java多线程(同步和死锁,生产者和消费者问题)
查看>>
STL algorithmi算法s_sorted和is_sorted_until(28)
查看>>
445port入侵具体解释
查看>>
华为面试题算什么,这个背会了外企随便进
查看>>
解决mysql控制台查询数据乱码的问题,有图有真相
查看>>
Oracle建立表空间和用户
查看>>
八字案例董易奇
查看>>