Description

背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠。
题意:
给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠。
烁烁他每次会跳到一个节点u,把周围与他距离不超过d的节点各吸引出w只皮皮鼠。皮皮鼠会被烁烁吸引,所以会一直待在节点上不动。
烁烁很好奇,在当前时刻,节点u有多少个他的好朋友---皮皮鼠。
大意:
给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:
Q x:询问x的点权。
M x d w:将树上与节点x距离不超过d的节点的点权均加上w。

Input

第一行两个正整数:n,m
接下来的n-1行,每行三个正整数u,v,代表u,v之间有一条边。
接下来的m行,每行给出上述两种操作中的一种。

Output

对于每个Q操作,输出当前x节点的皮皮鼠数量。

Sample Input

7 6
1 2
1 4
1 5
2 3
2 7
5 6
M 1 1 2
Q 5
M 2 2 3
Q 3
M 1 2 1
Q 2

Sample Output

2
3
6
和震波哪题很像,也是线段树+动态点分治
只不过将操作换了,一样的原理
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 using namespace std;
  7 #define MAX 120000
  8 struct Node
  9 {
 10   int next,to;
 11 }edge[MAX<<1];
 12 int num,head[MAX];
 13 int dep[MAX],fa[MAX],pos,size[MAX],minsize,root;
 14 int FA[MAX],son[MAX],top[MAX],Size;
 15 int lazy[MAX*150];
 16 int ch[MAX*150][2],RT[MAX<<1],n,m;
 17 int ans,val[MAX];
 18 bool vis[MAX];
 19 inline int gi()
 20 {
 21   int x=0,flag=1;
 22   char ch=getchar();
 23   while (ch<'0'||ch>'9')
 24     {
 25       if (ch=='-') flag=-1;
 26       ch=getchar();
 27     }
 28   while (ch>='0'&&ch<='9')
 29     {
 30       x=(x<<3)+(x<<1)+ch-'0';
 31       ch=getchar();
 32     }
 33   return x*flag;
 34 }
 35 inline void add(int u,int v)
 36 {
 37   num++;
 38   edge[num].next=head[u];
 39   head[u]=num;
 40   edge[num].to=v;
 41 }
 42 void dfs1(int x,int pa)
 43 {
 44   size[x]=1;
 45   dep[x]=dep[pa]+1;
 46   for (int i=head[x];i;i=edge[i].next)
 47     {
 48       int v=edge[i].to;
 49       if (v==pa) continue;
 50       fa[v]=x;
 51       dfs1(v,x);
 52       size[x]+=size[v];
 53       if (size[son[x]]<size[v])
 54       son[x]=v;
 55     }
 56 }
 57 void dfs2(int x,int tp)
 58 {
 59   top[x]=tp;
 60   if (son[x])
 61     dfs2(son[x],tp);
 62   for (int i=head[x];i;i=edge[i].next)
 63     {
 64       int v=edge[i].to;
 65       if (v==fa[x]||v==son[x]) continue;
 66       dfs2(v,v);
 67     }
 68 }
 69 int lca(int x,int y)
 70 {
 71   while (top[x]!=top[y])
 72     {
 73       if (dep[top[x]]<dep[top[y]]) swap(x,y);
 74       x=fa[top[x]];
 75     }
 76   if (dep[x]<dep[y]) return x;
 77   return y;
 78 }
 79 int dis(int x,int y)
 80 {
 81   return dep[x]+dep[y]-(dep[lca(x,y)]<<1);
 82 }
 83 void get_root(int x,int pa)
 84 {
 85   size[x]=1;
 86   int ret=0;
 87   for (int i=head[x];i;i=edge[i].next)
 88     {
 89       int v=edge[i].to;
 90       if (v==pa||vis[v]) continue;
 91       get_root(v,x);
 92       size[x]+=size[v];
 93       if (size[v]>ret) ret=size[v];
 94     }
 95   if (Size-size[x]>ret) ret=Size-size[x];
 96   if (ret<minsize) minsize=ret,root=x;
 97 }
 98 void solve(int x,int pa)
 99 {
100   vis[x]=1;
101   FA[x]=pa;
102   for (int i=head[x];i;i=edge[i].next)
103     {
104       int v=edge[i].to;
105       if (vis[v]) continue;
106       minsize=n;Size=size[v];
107       get_root(v,x);
108       solve(root,x);
109     }
110 }
111 void update(int &rt,int l,int r,int L,int R,int w)
112 {
113   if (!rt) rt=++pos;
114   if (l>=L&&r<=R)
115   {lazy[rt]+=w;return;}
116   int mid=(l+r)>>1;
117   if (L<=mid) update(ch[rt][0],l,mid,L,R,w);
118   if (R>mid) update(ch[rt][1],mid+1,r,L,R,w);
119 }
120 int query(int rt,int l,int r,int x)
121 {
122   if (!rt) return 0;
123   if (l==r)
124     return lazy[rt];
125   int mid=(l+r)>>1;
126   if (x<=mid) return query(ch[rt][0],l,mid,x)+lazy[rt];
127   else return query(ch[rt][1],mid+1,r,x)+lazy[rt];
128 }
129 void change(int u,int k,int w)
130 {
131   update(RT[u],0,n,0,k,w);
132   for (int i=u;FA[i];i=FA[i])
133     {
134       int d=dis(u,FA[i]);
135       if (d>k) continue;
136       update(RT[FA[i]],0,n,0,k-d,w);
137       update(RT[i+n],0,n,0,k-d,w);
138     }
139 }
140 void ask(int u)
141 {
142   ans+=query(RT[u],0,n,0);
143   for (int i=u;FA[i];i=FA[i])
144     {
145       int d=dis(u,FA[i]);
146       ans+=query(RT[FA[i]],0,n,d);
147       ans-=query(RT[i+n],0,n,d);
148     }
149 }
150 int main()
151 {int u,v;
152 char s[10];
153   cin>>n>>m;
154   for (int i=1;i<=n-1;i++)
155     {
156       u=gi();v=gi();
157       add(u,v);add(v,u);
158     }
159   dfs1(1,0);
160   dfs2(1,1);
161   minsize=Size=n;
162   get_root(1,0);
163   solve(root,0);
164   ans=0;
165   for (int i=1;i<=m;i++)
166     {
167       scanf("%s",s);
168       if (s[0]=='Q')
169         {
170             ans=0;
171             int x=gi();
172             ask(x);
173             printf("%d\n",ans);
174         }
175       else
176         {
177             int u=gi(),k=gi(),w=gi();
178             change(u,k,w);
179         }
180     }
181   return 0;
182 }
183 

转载于:https://www.cnblogs.com/Y-E-T-I/p/8366368.html

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 4372 烁烁的游戏 —— 动态点分治+树状数组

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

  4. bzoj 4372 烁烁的游戏 - 点分治 - 线段树

    动态点分治裸题 #include<iostream> #include<cstring> #include<cstdio> #include<map> ...

  5. [点分树] BZOJ 4372: 烁烁的游戏

    DescriptionDescription 给一颗nn个节点的树,边权均为11,初始点权均为00,mm次操作: Q xQ~x:询问xx的点权. M x d wM~x~d~w:将树上与节点xx距离不超 ...

  6. BZOJ4372: 烁烁的游戏

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

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

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

  8. 【bzoj4372】 烁烁的游戏【动态树分治】

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

  9. [bzoj4372]烁烁的游戏

    [bzoj4372]烁烁的游戏 动态点分,需要注意的是我们对于每个点要开两个数组,另外一个相当于一个容斥,即把他父亲上的减掉. 代码 #include<bits/stdc++.h> usi ...

最新文章

  1. 使用OpenCV进行人脸检测(Viola-Jones人脸检测方法)
  2. 21、 TRUNCATE:清空表记录
  3. 数据库SQL基础select语法
  4. SAP Spartacus UsersSelectors.getAddressesLoading
  5. mysql一些写常用命令
  6. Texlive中jpg和pdf转成eps
  7. NIHCC发布迄今世界最大的CT医学影像数据集(附下载)
  8. Android 布局 优先显示右侧的控件
  9. layui引入jQuery
  10. Linux的基本指令(2)-Linux从入门到精通第三天(非原创)
  11. 设置.md文件默认用Typora打开
  12. ElasticSearch 使用教程之_score(评分)介绍
  13. 做人,别伤人,别骗人,别负人!
  14. Mysql时间函数用法
  15. Win7 设置任务栏自动隐藏后,偶尔不能自动隐藏?
  16. 1443:【例题4】Addition Chains
  17. python地图实例_利用pyecharts实现地图可视化的例子
  18. 虹膜识别—DeepIrisNet2
  19. mysql数据表关联_MySQL表关联的常用方式有哪几种
  20. b站黑马Java就业班笔记P101-P200

热门文章

  1. 删除文件后清空了回收站要怎么恢复
  2. STC Monitor-51的单片机在线仿真调试(转)
  3. 微信小程序怎么推广运营-微信小程序引流方法
  4. 寻找真实IP-子域名查找
  5. unity3d 工程原理_Unity3D——镜面反射原理及实现(一)
  6. SQL Server是什么?SQL Server详细介绍
  7. unixODBC中 column .... does not exist 的解决过程
  8. html怎么在手机打不开,手机百度打不开网页怎么办 解决方法
  9. iOS各种被拒的原因汇总
  10. 前端实现实时消息提醒消息通知