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

本以为和 bzoj3730 一样,可以直接双倍经验了;

但要注意一下,树状数组不能查询0位置,所以再开一个 w 数组记录;

论 if 和 continue 的不同...如果要用到两个值,不要判断第一个后就 continue ...

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
int const xn=1e5+;
int n,hd[xn],ct,to[xn<<],nxt[xn<<],w[xn];
int siz[xn],fa[xn][],dis[xn][],dep[xn],mx,rt;
bool vis[xn];
vector<ll>t[xn],fx[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int Max(int x,int y){return x>y?x:y;}
int Min(int x,int y){return x<y?x:y;}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void getrt(int x,int ff,int sum)
{
siz[x]=; int nmx=;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==ff||vis[u])continue;
getrt(u,x,sum); siz[x]+=siz[u];
nmx=Max(nmx,siz[u]);
}
nmx=Max(nmx,sum-siz[x]);
if(nmx<mx)mx=nmx,rt=x;
}
void build(int x,int ff,int d)
{
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==ff||vis[u])continue;
fa[u][++dep[u]]=rt; dis[u][dep[u]]=d;
build(u,x,d+);
}
}
void work(int x,int sum)
{
vis[x]=; build(x,,);
t[x].resize(sum+); fx[x].resize(sum+);
for(int i=hd[x],u;i;i=nxt[i])
{
if(vis[u=to[i]])continue;
int ns=(siz[u]>siz[x]?sum-siz[x]:siz[u]);
mx=xn; getrt(u,,ns); work(rt,ns);
}
}
char dc[];
void ins(int nw,int x,int v){w[nw]+=v; for(x=Min(x,t[nw].size()-);x;x-=(x&-x))t[nw][x]+=v;}///w[nw]
ll query(int nw,int x){/*if(x==0)return w[nw];*/ ll ret=; for(;x<t[nw].size()&&x;x+=(x&-x))ret+=t[nw][x]; return ret;}
void ins2(int nw,int x,int v){for(x=Min(x,fx[nw].size()-);x;x-=(x&-x))fx[nw][x]+=v;}
ll query2(int nw,int x){ll ret=; for(;x<fx[nw].size()&&x;x+=(x&-x))ret+=fx[nw][x]; return ret;}
ll ask(int x)
{
ll ret=;
for(int i=dep[x];i;i--)
ret+=query(fa[x][i],dis[x][i])-(i==?:query2(fa[x][i],dis[x][i-]));
return ret+w[x];
} void change(int x,int d,int val)
{
for(int i=dep[x];i;i--)
{
//if(d<dis[x][i])continue;
if(d>=dis[x][i])ins(fa[x][i],d-dis[x][i],val);
if(d<dis[x][i-]||i==)continue;
ins2(fa[x][i],d-dis[x][i-],val);//
}
}
int main()
{
n=rd(); int m=rd();
for(int i=,x,y;i<n;i++)x=rd(),y=rd(),add(x,y),add(y,x);
mx=xn; getrt(,,n); work(rt,n);
for(int i=;i<=n;i++)fa[i][++dep[i]]=i;
for(int i=,x,d,val;i<=m;i++)
{
scanf("%s",dc+); x=rd();
if(dc[]=='Q')printf("%lld\n",ask(x));
else d=rd(),val=rd(),change(x,d,val);
}
return ;
}

bzoj 4372 烁烁的游戏 —— 动态点分治+树状数组的更多相关文章

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 和 bzoj 3070 震波 是一个套路.注意区间修改的话,树状数组不能表示 dis ...

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

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

  3. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  4. bzoj 3730 震波——动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 查询一个点可以转化为查询点分树上自己到根的路径上每个点对应范围答案.可用树状数组 f ...

  5. HDU 4918 Query on the subtree(动态点分治+树状数组)

    题意 给定一棵 \(n\) 个节点的树,每个节点有点权.完成 \(q\) 个操作--操作分两种:修改点 \(x\) 的点权.查询与 \(x\) 距离小于等于 \(d\) 的权值总和. \(1 \leq ...

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

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

  7. bzoj 3730 震波 —— 动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 建点分树,每个点记两个树状数组,存它作为重心管辖的范围内,所有点到它的距离情况和到它在 ...

  8. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

  9. luogu 5311 [Ynoi2011]D1T3 动态点分治+树状数组

    我这份代码已经奇怪到一定程度了~ 洛谷上一直 $TLE$,但是本地造了几个数据都过了. 简单说一下题解: 先建出来点分树. 对于每一个询问,在点分树中尽可能向上跳祖先,看是否能够处理这个询问. 找到最 ...

随机推荐

  1. java拾遗3----XML解析(三) StAX PULL解析

    使用PULL方式解析XML: Pull是STAX的一个实现 StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API StA ...

  2. elasticsearch从入门到出门-02-简单的CRUD

    操作背景: 电商网站上面的一个商品的增删改查: es 能接受的都是JSON格式的数据 Es 提供了一套简单的集群信息健康监控的api GET /_cat/health?v   epoch      t ...

  3. Java语言平台

    J2SE(Java 2 Platform Standard Edition) 标准版 开发普通桌面和商务应用程序提供的解决方案,该技术体系是下面两者的基础,可以完成一些桌面应用程序的开发 J2ME(J ...

  4. 为什么要对url进行encode

    发现现在几乎所有的网站都对url中的汉字和特殊的字符,进行了urlencode操作,也就是: http://hi.baidu.com/%BE%B2%D0%C4%C0%CF%C8%CB/creat/bl ...

  5. Django APP之contenttypes简单应用

    Conttenttypes介绍 当你看到contenttype你是不是想到了请求头的contenttype? 但是 此contenttypes不是请求头Content-Type而是Django自带的a ...

  6. Bootstrap 轮播图(Carousel)插件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. linux 中解压与压缩 常用操作详细讲解

    平时有时候 会在服务器进行一些文件的操作,比如安装一些服务与软件等等,都有解压操作,一般在 导出一些简单的服务器文件,也是先压缩后再导出,因此,在这里根据平时用到解压与压缩命令的频率来记录下: 1.最 ...

  8. Java中的String,StringBuilder,StringBuffer三者的区别(转发:https://www.cnblogs.com/su-feng/p/6659064.html)

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  9. ADT和Android SDK的安装

    本文主要涉及Android开发环境搭建时的Eclipse.ADT及Android SDK的安装方法,还有遇到的两个问题及其解决办法.其中,ADT的安装介绍了在线和离线安装两种方式.  1.安装ecli ...

  10. STM32L0 复位和时钟控制 Reset and clock control (RCC)

    时钟源: HSE:外部时钟 HSI16:可以直接用于系统时钟或者作为PLL输入.一般是1%精度 HSI48:The HSI48 clock signal is generated from an in ...