题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372

和 bzoj 3070 震波 是一个套路。注意区间修改的话,树状数组不能表示 dis = 0 的位置,所以要手动改父亲的点权数组。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const int N=1e5+5,K=20;
int n,w[N],hd[N],xnt,to[N<<1],nxt[N<<1],siz[N],rt,mn;
int pre[N][K],dep[N],dis[N][K],fs[N],gs[N]; vector<ll> f[N],g[N];
bool vis[N];
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;}
void add(int cr,int x,int k){for(x=Mn(x,fs[cr]);x;x-=(x&-x))f[cr][x]+=k;}
ll qry(int cr,int x){ll ret=0;for(;x&&x<=fs[cr];x+=(x&-x))ret+=f[cr][x];return ret;}
void addx(int cr,int x,int k){for(x=Mn(x,gs[cr]);x;x-=(x&-x))g[cr][x]+=k;}
ll qryx(int cr,int x){ll ret=0;for(;x&&x<=gs[cr];x+=(x&-x))ret+=g[cr][x];return ret;}
void getrt(int cr,int fa,int s)
{siz[cr]=1;int mx=0;for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa){getrt(v,cr,s);siz[cr]+=siz[v];mx=Mx(mx,siz[v]);}mx=Mx(mx,s-siz[cr]); if(mx<mn)mn=mx,rt=cr;
}
void dfs(int cr,int fa,int ds)
{pre[cr][++dep[cr]]=rt;dis[cr][dep[cr]]=ds;for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)dfs(v,cr,ds+1);
}
void init(int cr,int s)
{vis[cr]=1;fs[cr]=mn;gs[cr]=(mn<<1)+1;f[cr].resize(fs[cr]+1);g[cr].resize(gs[cr]+1);dfs(cr,0,0);for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]){int ts=(siz[v]<siz[cr]?siz[v]:s-siz[cr]);mn=N;getrt(v,cr,ts);init(rt,ts);}
}
void mdfy(int cr,int d,int k)
{add(cr,d,k); w[cr]+=k;for(int i=dep[cr]-1;i;i--){if(dis[cr][i]>d)continue;add(pre[cr][i],d-dis[cr][i],k); w[pre[cr][i]]+=k;/////addx(pre[cr][i+1],d-dis[cr][i],k);}
}
ll query(int cr)
{ll ret=w[cr];for(int i=dep[cr]-1;i;i--){ret+=qry(pre[cr][i],dis[cr][i]);ret-=qryx(pre[cr][i+1],dis[cr][i]);}return ret;
}
int main()
{n=rdn(); int Q=rdn();for(int i=1,u,v;i<n;i++)u=rdn(),v=rdn(),add(u,v),add(v,u);mn=N;getrt(1,0,n);init(rt,n);int x,d,k;char ch[5];while(Q--){scanf("%s",ch);x=rdn();if(ch[0]=='Q')printf("%lld\n",query(x));else{d=rdn(); k=rdn(); mdfy(x,d,k);}}return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10187308.html

bzoj 4372 烁烁的游戏——动态点分治+树状数组相关推荐

  1. bzoj 4372 烁烁的游戏 —— 动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 本以为和 bzoj3730 一样,可以直接双倍经验了: 但要注意一下,树状数组不能查询 ...

  2. bzoj 4372: 烁烁的游戏 动态点分治_树链剖分_线段树

    [Submit][Status][Discuss] Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳 ...

  3. 【BZOJ-3730】震波 动态点分治 + 树状数组

    3730: 震波 Time Limit: 15 Sec  Memory Limit: 256 MB Submit: 626  Solved: 149 [Submit][Status][Discuss] ...

  4. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  5. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

  6. BZOJ.3648.寝室管理(点分治 树状数组)

    BZOJ \(Description\) 求在一棵树上加一条边后,有多少条至少有\(k\)个点的路径. \(n\leq10^5\). \(Solution\) 对于一棵树的情况,可以点分治. 用树状数 ...

  7. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  8. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  9. 点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)

    题目链接 题目大意: 给出一棵树,问有多少条路径权值和不大于www,长度不大于lll 解题思路: 首先树上路径问题大概率就是点分治了 但是我们对于每个路径有两个性质就是(li,wi)(l_i,w_i) ...

最新文章

  1. exchange online share mailbox senditem
  2. vs 2017 建立 php,程序在VS 2017中输出的结果为什么是这样的?求助大神!谢谢!...
  3. 在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( )
  4. C/C++函数名修饰约定
  5. 【LeetCode笔记】102. 二叉树的层序遍历(Java、队列、DFS)
  6. html标题前圆圈样式,漂亮的css3圆形鼠标悬停效果实例
  7. iOS 14不跳票 6月见!苹果WWDC 2020将在线上举办:33年来首次
  8. 深观察|区块链不是洪水猛兽,但要警惕以区块链之名圈钱
  9. java mongo 日期范围_获取指定日期和它之前几天,之间的所有日期?千万不要踩了这个大坑!...
  10. 对于Linux安装mysql5.7版本出现的问题
  11. 盘点前端HTML基础知识
  12. Go基础系列:接口类型断言和type-switch
  13. 常用实用网站整理大全
  14. 获取KVM虚拟机IP地址
  15. 有意思、值得思考的文章记录
  16. python处理FITS 3:处理头文件和数据单元
  17. jmeter如何进行一个简单的测试(超级详细,有图有文字,闭着眼都能成功)
  18. 想哭!我相信“官方”消息,炒币仍然被骗
  19. 网站被恶意刷流量解决方案
  20. m基于MATLAB的上行链路MIMO关键技术的研究与性能分析

热门文章

  1. 面试-Iteration Owner-新加坡航空
  2. H2O with R 简明使用手记·下篇
  3. Matlab——行星轨道问题
  4. windows8 应用小技巧(41-45)
  5. git pull合并冲突
  6. 计算机思维导图初中,计算机思维导图
  7. Itext pdf的页眉页脚
  8. php搞笑证件,各类搞笑证件生成器,趣味证件制作软件,一次下载免费使用
  9. PHP excel导出(自定义样式,行高,合并单元格等)
  10. MySQL入门学习:组合查询