题目: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+5;
int n,hd[xn],ct,to[xn<<1],nxt[xn<<1],w[xn];
int siz[xn],fa[xn][20],dis[xn][20],dep[xn],mx,rt;
bool vis[xn];
vector<ll>t[xn],fx[xn];
int rd()
{int ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',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]=1; int nmx=0;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+1);}
}
void work(int x,int sum)
{vis[x]=1; build(x,0,1);t[x].resize(sum+1); fx[x].resize(sum+1);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,0,ns); work(rt,ns);}
}
char dc[5];
void ins(int nw,int x,int v){w[nw]+=v; for(x=Min(x,t[nw].size()-1);x;x-=(x&-x))t[nw][x]+=v;}///w[nw]
ll query(int nw,int x){/*if(x==0)return w[nw];*/ ll ret=0; 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()-1);x;x-=(x&-x))fx[nw][x]+=v;}
ll query2(int nw,int x){ll ret=0; for(;x<fx[nw].size()&&x;x+=(x&-x))ret+=fx[nw][x]; return ret;}
ll ask(int x)
{ll ret=0;for(int i=dep[x];i;i--)ret+=query(fa[x][i],dis[x][i])-(i==1?0:query2(fa[x][i],dis[x][i-1]));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-1]||i==1)continue;ins2(fa[x][i],d-dis[x][i-1],val);//
    }
}
int main()
{n=rd(); int m=rd();for(int i=1,x,y;i<n;i++)x=rd(),y=rd(),add(x,y),add(y,x);mx=xn; getrt(1,0,n); work(rt,n);for(int i=1;i<=n;i++)fa[i][++dep[i]]=i;for(int i=1,x,d,val;i<=m;i++){scanf("%s",dc+1); x=rd();if(dc[1]=='Q')printf("%lld\n",ask(x));else d=rd(),val=rd(),change(x,d,val);}return 0;
}

转载于:https://www.cnblogs.com/Zinn/p/10187538.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-3730】震波 动态点分治 + 树状数组

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

  4. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  5. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

  6. BZOJ.3648.寝室管理(点分治 树状数组)

    BZOJ \(Description\) 求在一棵树上加一条边后,有多少条至少有\(k\)个点的路径. \(n\leq10^5\). \(Solution\) 对于一棵树的情况,可以点分治. 用树状数 ...

  7. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  8. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  9. 点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)

    题目链接 题目大意: 给出一棵树,问有多少条路径权值和不大于www,长度不大于lll 解题思路: 首先树上路径问题大概率就是点分治了 但是我们对于每个路径有两个性质就是(li,wi)(l_i,w_i) ...

最新文章

  1. 新手推荐!天池数据挖掘挑战赛,2019全球数据智能大赛正式启动!60万奖金等你来拿...
  2. MYSQL触发器记录用户操作的命令
  3. 深度学习框架TensorFlow(3.变量)
  4. sysbench安装和使用(亲测)
  5. ProgressDialog知识要点
  6. 最详细的Vue Hello World应用开发步骤
  7. 乐高创意机器人moc_乐高MOC佳作欣赏丨机械之美机器人乐高作品集1
  8. linux 目录命令_Linux目录命令能力问题和解答
  9. Office 365 Pro Plus 离线安装包及自定义部署工具下载地址
  10. Pow(x, n) 求一个数的n次方
  11. 对PostgreSQL中bgwriter的 MyProc 的理解
  12. java解释器是哪个命令_宽恕命令解释器的最佳Java库(IES)
  13. 二叉树的非递归遍历(转载)
  14. 逻辑代码自动生成相关技术概述
  15. git/gitflow git工作流
  16. GNS3 添加思科交换机
  17. visio中绘制空间坐标系,visio导入科学图形包
  18. c语言打鱼晒网问题报告书,C语言之经典问题——渔夫打鱼晒网
  19. android 高仿 猿题库,猿题库(com.fenbi.android.gaozhong) - 9.17.2 - 应用 - 酷安
  20. leetcode 968 监控摄像头

热门文章

  1. 解决WARN TaskSchedulerImpl: Initial job has not accepted any resources;
  2. Mybatis入门(一)
  3. Celery多个定时任务使用RabbitMQ,Queue冲突解决
  4. 浅说深度学习(4):增强学习
  5. 深度学习《patchGAN》
  6. NLP《词汇表示方法(一)one-hot向量表示》
  7. [机器学习-sklearn]鸢尾花Iris数据集
  8. ResNet 运行在Cifar10 测试集86.38% Tensorflow 2.1 小白从代码实践中 理解
  9. pytorch保存模型pth_pytorch中保存的模型文件.pth深入解析
  10. Python库glob作用分析