题目描述:

圣诞节来了,仓鼠又要来策划活动了,今年仓鼠会在圣诞树上挂上铃铛!

已知圣诞树有 $n$ 个节点,并且根节点是固定的。记 $s[i]$ 表示以 $i$ 为根的子树中,所有节点上铃铛数目的总和。但仓鼠觉得询问 $s[i]$ 太简单了,他决定给定 $l$ 和 $r$,要你回答 $\sum\limits_{i=l}^{r}s[i]$ 的值。

但是为了避免有的人一次预处理后一劳永逸,仓鼠在大家答题的过程中还会修改某个节点上灯笼的数量。仓鼠还要去筹备活动,你能帮助他写一个程序帮助实时给出标准答案吗?

算法标签:分块

思路:

分块好题。

比较容易想到分块处理,但是这题要把各个部分分开算。

$cnt[x][i]$ 表示在第 $i$ 个块,有多少个点在 $x$ 到根的链上,那么每次修改 $val[x]$ 就会发生 $cnt[x][i]\times (new-val[x])$ 的权值变化。

对于单个点价值的计算,按照 $dfn$ 序做前缀和,单点修改区间查询,考虑再分一次块,对于每一次修改,对整个块有影响的对于这个块统一加一个值,否则单点加。那么一次查询效率就是 $O(1)$ 的了。

以下代码:

#include<bits/stdc++.h>
#define il inline
#define LL long long
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
const int N=1e5+5,M=320;
LL res[M],sum[N],tag[M],g[N];
int gr[N],sz,num[M][N],dfn[N],ed[N],tot;
int n,Q,val[N],rt,head[N],ne[N<<1],to[N<<1],cnt;
il int read(){int x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x;
}
il void ins(int x,int y){ne[++cnt]=head[x];head[x]=cnt;to[cnt]=y;
}
il void dfs(int x,int fa){for(int i=1;i<=gr[n];i++)num[i][x]=num[i][fa];num[gr[x]][x]++;dfn[x]=++tot;sum[tot]=sum[tot-1]+val[x];g[x]=val[x];for(int i=head[x];i;i=ne[i]){if(fa==to[i])continue;dfs(to[i],x);g[x]+=g[to[i]];}ed[x]=tot;res[gr[x]]+=g[x];
}
il LL cal(int x){return sum[ed[x]]-sum[dfn[x]-1]+tag[gr[ed[x]]]-tag[gr[dfn[x]-1]];
}
il void change(int x,int v){for(int i=1;i<=gr[n];i++)res[i]+=1ll*v*num[i][x];int p=dfn[x];for(int i=gr[p]+1;i<=gr[n];i++)tag[i]+=v;for(int i=p;i<=min(n,gr[p]*sz);i++)sum[i]+=v;
}
il LL query(int l,int r){LL ans=0;if(gr[l]==gr[r]){for(int i=l;i<=r;i++)ans+=cal(i);return ans;}for(int i=l;i<=gr[l]*sz;i++)ans+=cal(i);for(int i=(gr[r]-1)*sz+1;i<=r;i++)ans+=cal(i);for(int i=gr[l]+1;i<gr[r];i++)ans+=res[i];return ans;
}
int main()
{n=read();Q=read();sz=(int)sqrt(n);for(int i=1;i<=n;i++)val[i]=read();for(int i=1;i<=n;i++)gr[i]=(i-1)/sz+1;for(int i=1;i<=n;i++){int x=read(),y=read();if(x)ins(x,y),ins(y,x);else rt=y;}dfs(rt,0);while(Q--){int op=read(),l=read(),r=read();if(op==1){change(l,r-val[l]);val[l]=r;}else{printf("%lld\n",query(l,r));}}return 0;
}

View Code

转载于:https://www.cnblogs.com/Jessie-/p/10562365.html

dtoj#4258. 铃铛计数问题相关推荐

  1. #4258. 铃铛计数问题

    题意 内存限制:256 MiB 时间限制:2000 ms 圣诞节来了,仓鼠又要来策划活动了,今年仓鼠会在圣诞树上挂上铃铛! 已知圣诞树有 nnn 个节点,并且根节点是固定的.记 s[i]s[i]s[i ...

  2. 铃铛计数问题 解题报告

    U72118 铃铛计数问题 对点我们发现有两种编号,一种是它本身的编号用作询问,一种是便于我们子树/链的操作的重新编号. 如果对链树剖作为第二编号,把点放到二维平面内,我们就可以用个kd-tree维护 ...

  3. 铃铛计数问题——分块

    题目 [题目描述] 圣诞节来了,仓鼠又要来策划活动了,今年仓鼠会在圣诞树上挂上铃铛! 已知圣诞树有 $n$ 个节点,并且根节点是固定的.记 $s[i]$ 表示以 $i$ 为根的子树中,所有节点上铃铛数 ...

  4. 【分块】铃铛计数问题

    应该算分块的好题,因为我没想到 题目 求树上∑i=lrsi\sum_{i=l}^rs_i∑i=lr​si​,其中sis_isi​表示子树权值和,带修 题解 O(nn)O(n\sqrt n)O(nn​) ...

  5. UVA10294项链和手镯(等价类计数问题)

    题意:       给你一串珠子(连接成了一个环),共有n个珠子组成,你有t种颜色,现在你来给这个珠子染色,问染成项链有多少种方法?染成手镯有多少种方法?在项链里,经过顺时针旋转后相同的算一个,在手镯 ...

  6. F(n)完全覆盖中的计数问题

    完全覆盖中的计数问题 山西省原平一中 任所怀 这几天阅读周沛耕老师主编的<数学 兴趣与创造力>一书,读到"完全覆盖中的计数问题"这一节,感觉有点意思.于是自已试着做一个 ...

  7. 数学问题当中的一些基本计数问题

    一些基本的计数方法 三大原理: 加法原理.乘法原理.容斥原理 容斥原理:奇数个集合为正,偶数个集合为负 有重复元素的全排列.有k个元素,其中第i个有ni个,求全排列的的个数 (n1+n2+...... ...

  8. Loj #6089. 小 Y 的背包计数问题

    Loj #6089. 小 Y 的背包计数问题 Solution 似乎是比较套路的东西. 我们发现对于i≤ni\leq \sqrt ni≤n​的部分是一个多重背包,而剩下的部分是一个完全背包,因此考虑分 ...

  9. 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)

    三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi​:i 在原图中的度数 ...

  10. 一年中所有节日的排列顺序_计数问题(二)-排列组合的使用

    在计数问题(一)中我们分析了排列和组合的定义,计算方法以及公式的含义.排列组合的基本定义讲述的是从一列元素中分先后(排列)或不分先后地选出部分元素,其可能的选择方法数.在这一期中我们会更仔细地分析组合 ...

最新文章

  1. Win10安装NodeJS
  2. Source Insight 常用设置和快捷键大全
  3. 记一次MongoDB性能问题(从MySQL迁移到MongoDB)
  4. 数据仓库专题(6)-数据仓库、主题域、主题概念与定义
  5. TCP/IP 三次握手和四次挥手
  6. [转载] Java——System.exit()用法及个人理解
  7. linux 搭建cloudreve win映射网络驱动器WebDav
  8. 创新创业技术路线怎么写_项目申请中的技术路线该怎么写啊
  9. vmware上用kali破解wifi
  10. IT十大最尴尬瞬间 盖茨遭遇Win98死机列榜首
  11. python输入一个整数、输出该整数的所有素数因子_一个正整数的所有质数因子
  12. larval 数据库迁移
  13. element ui 表格头部内容不换行
  14. usb 接口触摸屏驱动
  15. macOS无法验证此App不包含恶意软件。
  16. 做直播|流量大时需要CDN加速
  17. 2021-10-01
  18. 用借款方实际付出的手续费(或利息)计算真实的手续费率(或利率),或快速估算年利率
  19. 利用51单片机+HC-SR04+51单片机制造超声波测距模块
  20. 常见UNIXLINUX系统

热门文章

  1. Spring经典高频面试题,原来是长这个样子
  2. 二十一天学通VC++之MFC线程处理概述
  3. 3.3 Spark概述
  4. 字符编码ASCII,Unicode和UTF-8
  5. php防丢包,记一次丢包网络故障
  6. mybatis多个foreach_mybatis的foreach 删除多条使用汇总
  7. Matlab中冒号“:“的使用方法
  8. msp430和stm32 dht11驱动程序
  9. Android IPC(二)Messenger实现跨进程双向通信
  10. Running pip as root will break packages and permissions. You should install packages reliably by usi