[bzoj4372]烁烁的游戏


动态点分,需要注意的是我们对于每个点要开两个数组,另外一个相当于一个容斥,即把他父亲上的减掉。

  • 代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,inf=1e9;
char getopt(){char x=0;while(x<'A'||x>'Z')x=getchar();return x;
}
char opt;
struct data{int lch,rch,x;
}t[N*60];
int n,m,root[N],root1[N],hed[N],nxt[N],to[N],ans,sum,rt,tot,sz;
int f[N],mi[20],anc[N][20],size[N],dep[N],vis[N],belong[N];void getroot(int x,int pre){f[x]=0,size[x]=1;for(int i=hed[x];i;i=nxt[i]){if(to[i]==pre||vis[to[i]])continue;getroot(to[i],x);size[x]+=size[to[i]];f[x]=max(f[x],size[to[i]]);}f[x]=max(f[x],sum-size[x]);if(f[x]<f[rt])rt=x;
}
void dfs(int x,int fthr){dep[x]=dep[fthr]+1;for(int i=1;i<=17;i++){if(dep[x]-mi[i]<0)break;anc[x][i]=anc[anc[x][i-1]][i-1];}for(int i=hed[x];i;i=nxt[i]){if(to[i]==fthr)continue;anc[to[i]][0]=x;dfs(to[i],x);}
}
int lca(int x,int y){if(dep[x]<dep[y])swap(x,y);int k=dep[x]-dep[y];for(int i=0;i<=17;i++)if((k>>i)&1)x=anc[x][i];if(x==y)return x;for(int i=17;i>=0;i--){if(anc[x][i]!=anc[y][i])x=anc[x][i],y=anc[y][i];}return anc[x][0];
}
int dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];}void build(int x){vis[x]=1;for(int i=hed[x];i;i=nxt[i]){if(vis[to[i]])continue;rt=0;sum=size[to[i]];getroot(to[i],x);belong[rt]=x;build(rt);}
}void insert(int &i,int l,int r,int x,int d){if(!i)i=++sz;t[i].x+=d;if(l==r)return;int mid=(l+r)>>1;if(x<=mid)insert(t[i].lch,l,mid,x,d);else insert(t[i].rch,mid+1,r,x,d);
}int qry(int now,int l,int r,int ll,int rr){if(ll<=l&&r<=rr)return t[now].x;int mid=(l+r)>>1;int ans=0;if(ll<=mid) ans+=qry(t[now].lch,l,mid,ll,rr);if(rr>mid) ans+=qry(t[now].rch,mid+1,r,ll,rr);return ans;
}
void change(int u,int x,int d,int w){int D=dis(u,x);if(d-D>=0)insert(root[u],0,n,d-D,w);int v=belong[u];if(!v)return;D=dis(x,v);if(d-D>=0)insert(root1[u],0,n,d-D,w);change(v,x,d,w);
}void calc(int u,int x){if(u==x)ans+=qry(root[u],0,n,0,n);else{int d=dis(u,x);ans+=qry(root[u],0,n,d,n);}if(!belong[u])return;int d=dis(belong[u],x);ans-=qry(root1[u],0,n,d,n);calc(belong[u],x);
}
void add(int x,int y){tot++;nxt[tot]=hed[x],to[tot]=y;hed[x]=tot;tot++;nxt[tot]=hed[y],to[tot]=x;hed[y]=tot;
}int main()
{mi[0]=1;for(int i=1;i<=1;i++)mi[i]=mi[i-1]<<1;scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);}dfs(1,0);rt=0;f[0]=inf;sum=n;getroot(1,0);build(rt);while(m--){opt=getopt();int x,d,w;if(opt=='Q'){scanf("%d",&x);ans=0;calc(x,x);printf("%d\n",ans);}else{scanf("%d%d%d",&x,&d,&w);d=min(d,n);change(x,x,d,w);}}
}

[bzoj4372]烁烁的游戏相关推荐

  1. BZOJ4372: 烁烁的游戏

    BZOJ4372: 烁烁的游戏 https://lydsy.com/JudgeOnline/problem.php?id=4372 分析: 不是很难想的一道题,用树状数组维护点分树上每一层分治中心的点 ...

  2. [BZOJ4372][烁烁的游戏][动态树分治+线段树+LCA]

    [BZOJ4372][烁烁的游戏][动态树分治+线段树+LCA] 题目大意: 给定一颗nn个节点的树,边权均为11,初始每个点权值为00 . 其中操作QQ xx询问x点的点权,操作 MM xx dd ...

  3. BZOJ3730 震波+BZOJ4372 烁烁的游戏(动态点分治)

    震波 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的 ...

  4. BZOJ4372: 烁烁的游戏【动态点分治】

    Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w ...

  5. BZOJ4372 烁烁的游戏(动态点分治+线段树)

    建出点分树,每个节点维护其作为点分树上lca对子树内点的贡献,线段树维护即可,同时另开一个线段树以减掉父亲重复的贡献. #include<iostream> #include<cst ...

  6. bzoj4372. 烁烁的游戏【动态点分治】

    传送门 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗nnn个节点的树,边权均为111,初始树上没有皮皮鼠. 烁烁他每次会跳到一个节点uuu,把周围与他距离不超过d的节点各吸引出www ...

  7. BZOJ4372: 烁烁的游戏(动态点分治)

    Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w ...

  8. bzoj4372 烁烁的游戏 动态点分治+线段树

    Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮鼠 ...

  9. bzoj4372 烁烁的游戏

    题目描述 题解: 动态 点分治. 点分治可以帮助我们将树上的点分层,如果我们把这些点按生成顺序建树的话,我们会得到一棵点分树. 点分树有一个特别好的性质,就是不管原来的树长什么样,建出来的点分树的深度 ...

最新文章

  1. mysql行格式化_MySQL数据格式化语句
  2. 创业者如何小步快跑,从0开始实现自己的产品?
  3. js禁止用户右键等操作
  4. Linux操作_常用命令操作练习
  5. Maven的发布plugin配置
  6. 【盘点2018】社交领域投融资报告来了!
  7. 字符串转python对象
  8. 【word论文排版教程3】制作样式和列表
  9. 残差灰色模型matlab,数学建模+灰色预测模型+MATLAB详解.doc
  10. 云管平台-FIT2CLOUD CMP2.0
  11. 个人信贷不良资产管理 难题亟待解决
  12. Ubuntu 安装微信,网页版无法登陆
  13. 日志过滤实体中的属性
  14. 对整个网页进行长截图
  15. 使用JiaoZiVideoPlayer播放视频方向横过来出现的问题
  16. STM32CubeMonitor监控程序目标变量并导出结果为csv格式
  17. GO 语言核心编程-全文版
  18. 获取系统中已经安装的文字输入法
  19. 安装好RStudio打开提示 Error Starting R 问题怎么解决?
  20. 小学计算机教案免费版,大连理工大学版小学信息技术教案

热门文章

  1. 计算机专业在职双证,计算机专业在职研究生可以获得在职研究生双证吗?
  2. 爬取今日头条收藏夹文章列表信息
  3. mcu 与电量计 BQ40Z80 通信,读取电芯电量
  4. android开发中绕过检测,[原创] 某加固软件的一些检测点以及绕过方法,欢迎补充...
  5. 五、椒盐排骨(Pepper Salt Spareribs)
  6. Android进阶之路 - 仿京东地址选择器使用指南
  7. iOS 使用HealthKit框架实现获取今日步数
  8. java 执行Linux命令并打印执行结果
  9. 2022-02-17 Android11 删除系统某种语言,我这里删掉粤语,修改frameworks/base/core/res/res/values/locale_config.xml里面的内容。
  10. java基础知识之加强