随笔分类 - 差分与前缀和
基础算法
摘要:操作 1 :把某个节点 x 的点权增加 a 。操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 //点修改+树修改,(点->根)链查询 #include<bits/stdc++.h> #define ll long long
阅读全文
摘要:题目描述异或是一种神奇的运算,大部分人把它总结成不进位加法.在生活中…xor运算也很常见。比如,对于一个问题的回答,是为1,否为0.那么:(A是否是男生 )xor( B是否是男生)=A和B是否能够成为情侣好了,现在我们来制造和处理一些复杂的情况。比如我们将给出一颗树,它很高兴自己有N个结点。树的每条
阅读全文
摘要:问题描述 给定一棵有n个点的树(点的编号为1~n),根为1,点有点权,设点i的初始值为0,给出q个操作,每个操作给出两个点和一个值,u,v,t,表示将u到v的路径上的所有点加t,输出所有操作后每个点的点权,。 输入格式 第一行输入两个整数n,q表示树的点的数目与操作次数 下面n-1行,每行两个整数x
阅读全文
摘要:问题描述有一棵n个点的树,每个点i有点树v[i],q个询问求点u到点v最简路径上所有点权之和输入格式第一行n,q表示有n个点,q个询问第二行n个整数表示每个点的权下面n-1每行三个整数x,y,z描述边的信息及边长 下面q行每行两个整数u,v表示询问的两个点路径长度 输出q行,每行为u到v最简路径长度
阅读全文
摘要:问题描述有一棵n个点的树,每个点i有点树v[i],q个询问求点u到点v最简路径上所有点权之和输入格式第一行n,q表示有n个点,q个询问 第二行n个整数表示每个点的权 下面n-1每行两个整数x,y描述边的信息下面q行每行两个整数u,v表示询问的两个点 输出q行,每行为u到v最简路径上的点权和样例in5
阅读全文
摘要:P1614爱与愁的心痛 分析:共计n-m+1个连续区间,从这n-m+1个数中取最小值。问题转为如何求这n-m+1个数,可以用前缀和进行优化。 //P1614爱与愁的心痛 #include<iostream> #include<algorithm> using namespace std; int a
阅读全文
摘要:P3368 【模板】树状数组 2由于差分数组的前缀和,为原数组的值,用树状数组去维护原数组的差分数组,区间[l,r]修改为t[l]+=delta,t[r+1]-=delta,单点s的查询变成区间[1-s]查询,变成求[1-s]的前缀和。 //P3368【模板】树状数组 2 //P3374 【模板】树
阅读全文
摘要:P1204 [USACO1.2]挤牛奶Milking Cows从暴力思想出发,建立一个int数组b用来标记哪些时间有人挤牛奶,哪些时间空闲,然后从有挤牛奶的时间开始统计每一个段挤牛奶时间和空闲时间,并求最长挤牛奶时间和最长空闲时间,这样做时间复杂度为O(n*s),s为挤牛奶的时间长度,会TLE。如果
阅读全文
摘要:普通线段树问题引入给定一个序列有n(n<=100000)个元素,有如下两个基本操作查询:给定区间[l..r],求这个区间所有元素的和修改:修改某个元素的值。任务:输出每个查询的值。任务数量m(m<=100000),只有上述两种操作。朴素算法一对于查询任务可以使用循环完成,时间复杂度O(n)。对于修改
阅读全文
摘要:P3406 海底高铁题解区间修改可以用差分思想,统计每个点出现次数用前缀和,最后取最小值 #include<bits/stdc++.h> using namespace std; const int maxn=100009; int p[maxn],v[maxn]; long long ans; i
阅读全文
摘要:P5638 【CSGRound2】光骓者的荣耀题解:由题意可知枚举i=1~n-k,且i+k~n两段的和求最小值,纯暴力时间O(n2),此题会TLE,预处理前缀和,可以加快两点的和求解时间为O(n),注意数据大小要long long 类型。 #include<bits/stdc++.h> using
阅读全文
摘要:P1115 最大子段和 /* P1115 最大子段和 */ #include<cstdio> #include<iostream> using namespace std; int main() { // freopen("p1115_2.in","r",stdin); int ans; int s
阅读全文
摘要:差分数组差分数组就是原数组对应项和它前面那项的差值 。来看一个例子:原数组 a:5,8,4,3,15差分数组 b:5,3,-4,-1,12还是先来看例子:原数组:a:5,8,4,3,15它的前缀和数组:c:5,13,17,20,35它的差分数组:b:5,3,4,1,12它的差分前缀和(就是差分数组的
阅读全文
摘要:前缀和是一种重要的预处理,能大大降低查询的时间复杂度。最简单的一道题就是给定 n 个数和 m 次询问,每次询问一段区间的和。求一个 O(n + m) 的做法。用 O(n) 前缀和预处理,O(m) 询问。一、一维前缀和主要代码 for(int i = 1; i <= n; ++i) sum[i] =
阅读全文