动态点分治裸题

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<algorithm>
#define N 100010
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
struct edges{int to,pre;
}e[N<<1];int h[N],etop,List[N],Lcnt;
inline int add_edge(int u,int v)
{return e[++etop].to=v,e[etop].pre=h[u],h[u]=etop;
}
struct segment{int l,r,pt;segment *ch[2];
}*rt[N];int sz[N],d[N],pre[N];
map<int,int> zid[N],len[N],dz[N];
map<int,segment*> rtz[N];bool vis[N];
int build(segment* &rt,int l,int r)
{rt=new segment,rt->l=l,rt->r=r,rt->pt=0;int mid=(l+r)>>1;if(l==r) return 0;return build(rt->ch[0],l,mid),build(rt->ch[1],mid+1,r);
}
int update(segment* &rt,int s,int t,int v)
{int l=rt->l,r=rt->r,mid=(l+r)>>1;if(s<=l&&r<=t) return rt->pt+=v;if(s<=mid) update(rt->ch[0],s,t,v);if(mid<t) update(rt->ch[1],s,t,v);return 0;
}
int query(segment* &rt,int p)
{int l=rt->l,r=rt->r,mid=(l+r)>>1;if(l==r) return rt->pt;int ans=rt->pt;if(p<=mid) return ans+query(rt->ch[0],p);else return ans+query(rt->ch[1],p);
}
int getsz(int x,int fa)
{sz[x]=1;for(int i=h[x],y;i;i=e[i].pre)if(!vis[y=e[i].to]&&e[i].to!=fa)sz[x]+=getsz(y,x);return sz[List[++Lcnt]=x];
}
int getrt(int &x)
{for(int i=1,fsz=sz[x],t=fsz;i<=Lcnt;i++){int y=List[i],ysz=fsz-sz[y];for(int j=h[y];j;j=e[j].pre)if(sz[e[j].to]<sz[y]) ysz=max(ysz,sz[e[j].to]);if(ysz<t) t=ysz,x=y;}return Lcnt=0;
}
int solve(int x,int fa,int y,int z,int dis)
{len[x][y]=dis,d[y]=max(d[y],dis),zid[x][y]=z,dz[y][z]=max(dz[y][z],dis);for(int i=h[x],t;i;i=e[i].pre)if(!vis[t=e[i].to]&&e[i].to!=fa)solve(t,x,y,z,dis+1);return 0;
}
int dfs(int x,int las)
{getsz(x,0),getrt(x),pre[x]=las,vis[x]=true;for(int i=h[x],y;i;i=e[i].pre)if(!vis[y=e[i].to])solve(y,x,x,y,1),build(rtz[x][y],0,dz[x][y]);build(rt[x],0,d[x]);for(int i=h[x],y;i;i=e[i].pre)if(!vis[y=e[i].to]) dfs(y,x);return 0;
}
inline int update(int x,int dis,int w)
{update(rt[x],0,min(d[x],dis),w);for(int y=pre[x];y;y=pre[y]){int z=zid[x][y],l=len[x][y];if(l>dis) continue;update(rt[y],0,min(dis-l,d[y]),w),update(rtz[y][z],0,min(dis-l,dz[y][z]),w);}return 0;
}
inline int query(int x)
{int ans=query(rt[x],0);for(int y=pre[x];y;y=pre[y]){int z=zid[x][y],l=len[x][y];ans+=query(rt[y],l)-query(rtz[y][z],l);}return ans;
}
char opt[10];
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);add_edge(u,v),add_edge(v,u);}dfs(1,0);while(m--){scanf("%s",opt);int x,l,w;if(opt[0]=='Q') scanf("%d",&x),printf("%d\n",query(x));else scanf("%d%d%d",&x,&l,&w),update(x,l,w);}return 0;
}


bzoj 4372 烁烁的游戏 - 点分治 - 线段树相关推荐

  1. BZOJ 4372 烁烁的游戏

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

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

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

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

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

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

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

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

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

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

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

  7. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

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

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

    题目描述 给一颗n个节点的树,边权均为1,初始点权均为0,m次操作: Q x:询问x的点权. M x d w:将树上与节点x距离不超过d的节点的点权均加上w. 输入 第一行两个正整数:n,m 接下来的 ...

  9. 洛谷T44252 线索_分治线段树_思维题

    分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Cod ...

最新文章

  1. 对国内云计算三个现象的思考
  2. pythondistinct教程_mongodb如何执行distinct
  3. 【es6】谈谈Promise
  4. Appium Python 六:管理应用和Activity
  5. [Android]使用Dagger 2进行依赖注入 - Producers(翻译)
  6. 【源码】斗地主人机对战程序算法2012完整版
  7. ROBEL:谷歌推出低成本机器人训练平台
  8. 势逼 React Native,跨平台开发框架 Flutter 很凶猛
  9. 2016.8.23 项目总结
  10. java实现秒杀系统_Java秒杀系统--4.实现秒杀接口
  11. 设计思想之高内聚低耦合
  12. sql语句如何获得当前日期
  13. 新手指南:顶象验证码如何接入微信小程序?
  14. 建筑业营业税改征增值税调整的通知(二)〔2018〕392号
  15. 街道大动土,断网一周,学习计划照旧
  16. 下载ug时java更新未完成_UG导入导出Dwg,Dxf文件提示:转换未完成,网上说的方法都试了一遍没用怎么办?...
  17. Quartz - Java 任务调度
  18. sed: -e expression #1, char 0: no previous regular expression
  19. UVa 1624 打结(Knots)
  20. LED背光源运用在数控设备上

热门文章

  1. 茅侃侃 | 生亦何哀,死亦何苦
  2. 阿里2017实习一面二面
  3. 论文笔记之Stein变分梯度下降
  4. python123.io同一个号可以同时在不同设备登陆吗-Python 高级 3
  5. 贷款市场报价利率(LPR)与贷款基准利率介绍
  6. LIS的O(nlogn)算法(二分)
  7. 华为云数据中心建设全面复工进行中,预计2021年投入使用
  8. Windows如何远程连接服务器?Linux服务器如何远程登录?远程连接服务器命令
  9. windows防火墙设置_Windows防火墙:您应该知道的事情
  10. 视觉SLAM笔记(40) 特征点的缺陷