题目大意: 给定一棵\(n\)个节点的带权树有根树,设\(sum_p\)表示以点\(p\)为根的这棵子树中所有节点的权 计算姬支持下列两种操作: 给定两个整数\(u,v\),修改点\(u\)的权值为\(v\). 给定两个整数\(l,r\),计算\(\sum_{i=l}^rsum_i\) 题解: 表示自己没能想出来...被同桌嘲讽了QAQ... 首先是这道题的数据范围很奇怪,只有10W,这就说明了你有充足的时间来瞎搞 所以我们就瞎搞 如果没有修改操作那么我们直接\(O(n)\)预处理就可以\(O(…
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4765 这道题已经攒了半年多了...因为懒,一直没去写...所以今天才把这道题写出来... 如果是要维护区间权值和.子树权值和,都可以用线段树/树状数组轻松解决.但是这道题要维护的是子树权值和的区间和,这就比较难搞了. 当需要维护一些看起来很难直接维护的信息时,我们一般会想到分块.于是考虑这样的分块:按编号把每√n个节点划分为一块,维护每一块所有节点的sum值的和,然后再维护每个节点的s…
Description "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬.文艺计算姬比普通计算机有更多的艺术细胞. 普通计算机能计算一个带标号完全图的生成树个数,而文艺计算姬能计算一个带标号完全二分图的生成树个数. 更具体地,给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图K_{n,m},计算姬能快速算出其生成树个数. 小W不知道计算姬算的对不对,你能帮助他吗? Input 仅一行三个整数n,m,p,表示给出的完全二分图K_{n,m} 1 &l…
题目链接 Description "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些.普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更具体地,小G的计算姬可以解决这么个问题: 给定一棵\(n\)个节点的带权树,节点编号为\(1\)到\(n\),以\(root\)为根,设\(val[p]\)表示以点\(p\)为根的这棵子树中所有节点的权值和.计算姬支持下列两种操作: 给定两个整数\(u\),\(v\),修改点\(u\)的权值…
传送门 Description "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬.文艺计算姬比普通计算机有更多的艺 术细胞.普通计算机能计算一个带标号完全图的生成树个数,而文艺计算姬能计算一个带标号完全二分图的生成树 个数.更具体地,给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图K_{n,m},计算姬能快 速算出其生成树个数.小W不知道计算姬算的对不对,你能帮助他吗? Input 仅一行三个整数n,m,p,表示给出的完全二分图K_{n,m}…
题意: 思路:分块 使用树状数组维护sum[i]的前缀和 使用主席树维护root到u的路径上点的编号出现的个数 每次操作如果是修改就加入队列 如果是询问,考虑块内操作对询问的影响,每次在x点加上y会使x到root的点sum都加上y 每根号n次操作就暴力重构一次,清空队列并求出新的sum[i]的前缀和 ..]of record l,r:longint; s:int64; end; sum,bit:..]of int64; stk:..,..]of longint; head,vet,next,fa…
题意 给出一棵有根树,$n$个点每个都有一个点权.$m$组操作每次可以修改一个点权或者询问编号在区间$[l,r]$的点的子树权值和的和. Solution 我们对节点编号分块,每一块统计该块中的节点的子树权值和的和.dfs处理出修改一个节点,需要对应修改它的祖先和它的所在的哪些块.另外再开一个树状数组,树状数组中每一个元素是对应dfs的点的权值,这样我们可以求出任意子树的权值和. 对于询问,在中间的块直接统计.两侧零散的块在树状数组上暴力查询子树权值和.所以令块的大小$S=\sqrt{n/\lo…
一道奇奇怪怪的数据结构题? 把树线性化,然后分块维护吧. 为了加速,求和用树状数组维护每个块的值. #include<bits/stdc++.h> #define N 100010 #define M 320 using namespace std; typedef long long ll; typedef unsigned long long ull; ]; ll c[N],ans[N],val[N]; int cnt,tot,head[N],block,rt,tpos[N],pos[N]…
真是道好题...感到灵魂的升华... 按dfs序建树状数组,拿前缀和去求解散块: 按点的标号分块,分成一个个区间,记录区间子树和 的 总和... 具体地,需要记录每个点u修改后,对每一个块i的贡献,记为t[u][i] 计算思路:dfs时,每到一个新的点,就让++c[其所在块],为了记录每个块中的点出现过几次,就相当于记录这个点 被每一块中的点 包含了几次 , 然后for一遍,记录t[u][i]=c[i] 当修改一个点时,这个块的和+=这个点u对块i的贡献*这个点的变化量,即sum[i]+=t[u…
题目: 给定一个一边点数为\(n\),另一边点数为\(m\),共有\(n*m\)条边的带标号完全二分图\(K_{n,m}\) 计算其生成树个数 \(n,m,p \leq 10^{18} ,p为模数\) 题解: 构建出基尔霍夫矩阵. 找到n-1阶主子式后将所有的行直接加到第一行上. 可以得到前n个是1,后m个是0的一个行向量. 然后用这个行向量消剩下的n-m-2行. 很容易得到一个上三角矩阵. 将对角线上的值乘起来即为答案. \(ans = n^{m-1}m^{n-1}\) #include <c…