题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $x$ ,或询问使用 $[l,r]$ 内瓶子能够凑出的最小体积. 输入 第一行包括两个数字:瓶子数n,事件数m. 第二行包含n个整数,表示每个瓶子的容量vi. 接下来m行,每行先有三个整数fi li ri. 若fi=1表示询问li到ri他最少能倒腾出的汽油量最少是多少? 若fi=2 再读入一个整数x.…
[BZOJ5028]小Z的加油店 题目大意: 一个长度为\(n(n\le10^5)\)的数列,\(m(m\le10^5)\)次操作,支持区间加和区间\(\gcd\). 思路: 线段树维护差分,\(\gcd(A_l,\cdots,A_r)\)就是区间\([l,r]\)差分的\(\gcd\)与\(A_r\)的\(\gcd\). 源代码: #include<cstdio> #include<cctype> #include<algorithm> inline int geti…
题意:维护支持以下两种操作的序列:1 l r询问a[l...r]的gcd,2 l r x把a[l...r]全部+x 题解:一道经典题.根据gcd(a,b)=gcd(a-b,b)以及区间加可知,这题可以差分求解.然后只需要维护支持单点加减和区间查询gcd.差分和的线段树即可,复杂度O(nlog2n),因为要求区间gcd. #include<bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|…
D - 小Z的加油店 HYSBZ - 5028   这个题目是一个线段树+差分+GCD 推荐一个差分的博客:https://www.cnblogs.com/cjoierljl/p/8728110.html 学会了这个简单差分之后,就可以把这个题目的区间更新转化成单点更新了,emmm...可能还是不太理解,那就说下具体思路吧. 这个题目一看感觉很难,然后就取看题解,这个看了题解之后发现裴蜀定理+线段树. 讲一下为什么是裴蜀定理+线段树,线段树应该没有什么异议,因为这个有区间更新区间查询,而且n,m…
题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.从中选出 $k$ 个瓶子,使得能够通过这 $k$ 个瓶子凑出的最小体积最大.求这个体积. 输入 第1行:2个整数N,K,  第2..N 行:每行1个整数,第i+1 行的整数为Vi 输出 仅1行,一个整数,表示火星人给出燃料的最大值. 样例输入 3 2 3 4 4 样例输出 4 题解 扩展裴蜀定理+STL-map 显然通过容量为 $v_1,v_2,...,v_…
题目描述 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 输入 第一行给出数字N,代表有N个数 下面一行给出N个数 输出 S的最小值 样例输入 2 4059 -1782 样例输出 99 题解 扩展裴蜀定理 裴蜀定理:二元一次不定方程 $ax+by=c$ 存在整数解的充分必要条件是 $\gcd(a,b)|c$. 扩展裴蜀定理:改成n元一次不定方程,结论依然成立. 证明: $a_1x_1+a_2x_2$ 的取值范围为 $k·\gc…
[题解] 本题要求求出区间内的各个元素通过加减之后能够得出的最小的数,那么根据裴蜀定理可知答案就是区间内各个元素的最大公约数. 那么本题题意化简成了维护一个序列,支持区间加上某个数以及查询区间元素的最大公约数. 我们要证明这样一个定理: 对于一个序列(a,b,c,d,...),gcd(a,b,c,d,...)=gcd(a,b-a,c-b,d-c,...),文字表述就是原序列的最大公约数等于序列差分后的最大公约数. 证明方法如下:    1,设t为序列(a,b,c,d,...)的公约数,a<b<…
Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1.把一个瓶子完全加满: 2.把一个瓶子完全倒空: 3.把一个瓶子里的汽油倒进另一个瓶子,直到倒出瓶子空了或者倒进的瓶子满了. 当然,为了回馈用户,小Z会时不时选择连续一段瓶子,给每个瓶子容积都增加x. 为了尽可能给更多的人加油,每次客户来加油他都想知道他能够倒腾出的汽油量最少是多少? 当然他不会一点汽…
NOI2012魔幻棋盘弱化版 gcd(a,b,c,d,e)=gcd(a,b-a,c-b,d-c,e-d) 然后就可以把区间修改变成差分后的点修了. 用BIT维护原序列,线段树维护区间gcd,支持点修区查 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #define ll long long using namespace std; ; ]; int n,m,ty…
[算法]数学+线段树/树状数组 [题解] 首先三个操作可以理解为更相减损术或者辗转相除法(待证明),所以就是求区间gcd. 这题的问题在线段树维护gcd只能支持修改成一个数,不支持加一个数. 套路:gcd(a,b,c,d,e)=gcd(a-b,b-c,c-d,d-e,e),也就是所有数的gcd可以转化为所有差值和最后一个数的gcd. 那么只需要查询区间差值gcd和一个数. 对于区间差值gcd查询,区间加数只会导致两个单位的差值变化,所以可以用线段树单点修改区间查询gcd. 对于一个数查询,就用树…