BZOJ4372: 烁烁的游戏

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

分析:

  • 不是很难想的一道题,用树状数组维护点分树上每一层分治中心的点分序即可。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define N 100050
#define db(x) cerr<<#x<<" = "<<x<<endl
int n,m,head[N],to[N<<1],nxt[N<<1],cnt;
int siz[N],root,tot,fk[N],dep[N],dis[N][20],fa[N][20];
int used[N],bg[N][2],ed[N][2],satori,pos[N][20][2],c[N*40];
struct A {int x,d;A() {}A(int x_,int d_) {x=x_,d=d_;}bool operator < (const A &u) const {return d<u.d;}
}a[N*40];
inline void add(int u,int v) {to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
void gr(int x,int y) {int i;siz[x]=1; fk[x]=0;for(i=head[x];i;i=nxt[i]) if(to[i]!=y&&!used[to[i]]) {gr(to[i],x); siz[x]+=siz[to[i]];fk[x]=max(fk[x],siz[to[i]]);}fk[x]=max(fk[x],tot-fk[x]);if(fk[x]<fk[root]) root=x;
}
void gd(int x,int y,int rt,int d) {int i;a[++satori]=A(x,d);a[satori+tot]=A(x,dis[x][dep[x]]);fa[x][++dep[x]]=rt;dis[x][dep[x]]=d;for(i=head[x];i;i=nxt[i]) if(to[i]!=y&&!used[to[i]]) {gd(to[i],x,rt,d+1);}
}
void solve(int x) {used[x]=1; int i;int all=tot;bg[x][0]=satori+1; ed[x][0]=satori+all;bg[x][1]=satori+all+1; ed[x][1]=satori+all+all;gd(x,0,x,0);satori+=all;sort(a+bg[x][0],a+ed[x][0]+1);sort(a+bg[x][1],a+ed[x][1]+1);for(i=bg[x][0];i<=ed[x][0];i++) {pos[a[i].x][dep[a[i].x]][0]=i;}for(i=bg[x][1];i<=ed[x][1];i++) {pos[a[i].x][dep[a[i].x]][1]=i;}for(i=head[x];i;i=nxt[i]) if(!used[to[i]]) {tot=siz[to[i]]; if(tot>siz[x]) tot=all-siz[x];root=0; gr(to[i],x); solve(root);}
}
void fix(int x,int o,int k,int v) {if(!x) return ;int b=bg[x][o],e=ed[x][o],l=b,r=e+1;while(l<r) {int mid=(l+r)>>1;if(a[mid].d<=k) l=mid+1;else r=mid;}l--;int t=l-b+1;for(;t;t-=t&(-t)) c[t+b]+=v;
}
int inq(int x,int o,int p) {int b=bg[x][o],e=ed[x][o],re=0;int t=p-b+1,lim=e-b+1;for(;t<=lim;t+=t&(-t)) re+=c[t+b]; return re;
}
void update(int x,int k,int v) {int i;for(i=dep[x];i;i--) if(k>=dis[x][i]) {// db(fa[x][i]);fix(fa[x][i],0,k-dis[x][i],v);fix(fa[x][i+1],1,k-dis[x][i],-v);}
}
int query(int x) {int i,re=0;for(i=dep[x];i;i--) re+=inq(fa[x][i],0,pos[x][i][0])+inq(fa[x][i+1],1,pos[x][i+1][1]);return re;
}
char opt[10];
int main() {scanf("%d%d",&n,&m);int i,x,y;for(i=1;i<n;i++) {scanf("%d%d",&x,&y);add(x,y); add(y,x);}tot=n; fk[0]=1<<30; gr(1,0); solve(root);while(m--) {int k;scanf("%s%d",opt,&x);if(opt[0]=='M') {scanf("%d%d",&k,&y);update(x,k,y);}else {printf("%d\n",query(x));}}
}
/*
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
*/

转载于:https://www.cnblogs.com/suika/p/10164419.html

BZOJ4372: 烁烁的游戏相关推荐

  1. [bzoj4372]烁烁的游戏

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

  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. ensp删除静态路由命令_(温州大学)路由与交换机 期末试卷及解析
  2. ADSL上网常见错误提示
  3. CheckStyle
  4. 消除类游戏ccf c语言,ccf试题 消除类游戏
  5. CVPR 2018 SA-Siam:《A Twofold Siamese Network for Real-Time Object Tracking》论文笔记
  6. 【转】Senior Data Structure · 浅谈线段树(Segment Tree)
  7. redis源码剖析(5):基础数据结构inset
  8. 单片机课程设计--电子密码锁(源代码+proteus仿真)
  9. 在windows 2003 中,启动SQL Server 2000 提示“没有找到MSVCR71.dll因此这个应用程序未能启动”
  10. Windows远程连接Linux界面的两种方法
  11. 银行数字化转型导师坚鹏:《银行业同业竞争策略分析》
  12. Windows Server 2016 IPAM 服务管理-李海园-专题视频课程
  13. Proofs for Inner Pairing Products and Applications 学习笔记
  14. PageAdmin CMS仿站教程,自己建网站就是如此简单
  15. java模拟微博登录_Python模拟微博登陆,亲测有效
  16. c++中多重继承二义性产生以及二义性的消除方法
  17. 手机副业哪个好?利用手机赚钱并不难
  18. 使用java的方式配置Spring---JavaConfig
  19. OpenCV--011:像素归一化
  20. 运维标准化与流程化建设深度指南(转)

热门文章

  1. 最新Quarters II 13.1 下载安装全教程 + ModelSim联调(2022/12/11 )
  2. 微信营销怎么做,5中常见运作模式解析
  3. 查看webpack版本
  4. 问题记录:SyntaxError: Missing parentheses in call to ‘print‘.
  5. 聚会活跃气氛小程序-喝酒神器
  6. 苹果cms的php.ini,苹果cms伪静态设置教程
  7. 阿里云服务器和 hexo 博客实战
  8. 总结篇:消息中间件MQ的学习境界和路线
  9. R:数据分析-----汽车数据可视化
  10. COMSOL中导出美观的三维几何结构