dtoj#4258. 铃铛计数问题
题目描述:
圣诞节来了,仓鼠又要来策划活动了,今年仓鼠会在圣诞树上挂上铃铛!
已知圣诞树有 $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. 铃铛计数问题相关推荐
- #4258. 铃铛计数问题
题意 内存限制:256 MiB 时间限制:2000 ms 圣诞节来了,仓鼠又要来策划活动了,今年仓鼠会在圣诞树上挂上铃铛! 已知圣诞树有 nnn 个节点,并且根节点是固定的.记 s[i]s[i]s[i ...
- 铃铛计数问题 解题报告
U72118 铃铛计数问题 对点我们发现有两种编号,一种是它本身的编号用作询问,一种是便于我们子树/链的操作的重新编号. 如果对链树剖作为第二编号,把点放到二维平面内,我们就可以用个kd-tree维护 ...
- 铃铛计数问题——分块
题目 [题目描述] 圣诞节来了,仓鼠又要来策划活动了,今年仓鼠会在圣诞树上挂上铃铛! 已知圣诞树有 $n$ 个节点,并且根节点是固定的.记 $s[i]$ 表示以 $i$ 为根的子树中,所有节点上铃铛数 ...
- 【分块】铃铛计数问题
应该算分块的好题,因为我没想到 题目 求树上∑i=lrsi\sum_{i=l}^rs_i∑i=lrsi,其中sis_isi表示子树权值和,带修 题解 O(nn)O(n\sqrt n)O(nn) ...
- UVA10294项链和手镯(等价类计数问题)
题意: 给你一串珠子(连接成了一个环),共有n个珠子组成,你有t种颜色,现在你来给这个珠子染色,问染成项链有多少种方法?染成手镯有多少种方法?在项链里,经过顺时针旋转后相同的算一个,在手镯 ...
- F(n)完全覆盖中的计数问题
完全覆盖中的计数问题 山西省原平一中 任所怀 这几天阅读周沛耕老师主编的<数学 兴趣与创造力>一书,读到"完全覆盖中的计数问题"这一节,感觉有点意思.于是自已试着做一个 ...
- 数学问题当中的一些基本计数问题
一些基本的计数方法 三大原理: 加法原理.乘法原理.容斥原理 容斥原理:奇数个集合为正,偶数个集合为负 有重复元素的全排列.有k个元素,其中第i个有ni个,求全排列的的个数 (n1+n2+...... ...
- Loj #6089. 小 Y 的背包计数问题
Loj #6089. 小 Y 的背包计数问题 Solution 似乎是比较套路的东西. 我们发现对于i≤ni\leq \sqrt ni≤n的部分是一个多重背包,而剩下的部分是一个完全背包,因此考虑分 ...
- 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)
三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi:i 在原图中的度数 ...
- 一年中所有节日的排列顺序_计数问题(二)-排列组合的使用
在计数问题(一)中我们分析了排列和组合的定义,计算方法以及公式的含义.排列组合的基本定义讲述的是从一列元素中分先后(排列)或不分先后地选出部分元素,其可能的选择方法数.在这一期中我们会更仔细地分析组合 ...
最新文章
- Win10安装NodeJS
- Source Insight 常用设置和快捷键大全
- 记一次MongoDB性能问题(从MySQL迁移到MongoDB)
- 数据仓库专题(6)-数据仓库、主题域、主题概念与定义
- TCP/IP 三次握手和四次挥手
- [转载] Java——System.exit()用法及个人理解
- linux 搭建cloudreve win映射网络驱动器WebDav
- 创新创业技术路线怎么写_项目申请中的技术路线该怎么写啊
- vmware上用kali破解wifi
- IT十大最尴尬瞬间 盖茨遭遇Win98死机列榜首
- python输入一个整数、输出该整数的所有素数因子_一个正整数的所有质数因子
- larval 数据库迁移
- element ui 表格头部内容不换行
- usb 接口触摸屏驱动
- macOS无法验证此App不包含恶意软件。
- 做直播|流量大时需要CDN加速
- 2021-10-01
- 用借款方实际付出的手续费(或利息)计算真实的手续费率(或利率),或快速估算年利率
- 利用51单片机+HC-SR04+51单片机制造超声波测距模块
- 常见UNIXLINUX系统
热门文章
- Spring经典高频面试题,原来是长这个样子
- 二十一天学通VC++之MFC线程处理概述
- 3.3 Spark概述
- 字符编码ASCII,Unicode和UTF-8
- php防丢包,记一次丢包网络故障
- mybatis多个foreach_mybatis的foreach 删除多条使用汇总
- Matlab中冒号“:“的使用方法
- msp430和stm32 dht11驱动程序
- Android IPC(二)Messenger实现跨进程双向通信
- Running pip as root will break packages and permissions. You should install packages reliably by usi