AcWing 246. 区间最大公约数】的更多相关文章

246. 区间最大公约数 思路: 首先根据更相减损术,我们得到一个结论: \(gcd(a_l, a_{l+1}, ...,a_r) = gcd(a_l, a_{l+1}-a_l, a_{l+2}-a_{l+1}, ..., a_r-a_{r-1})\) 于是我们用线段树维护差分数组,树状数组维护每个位置的值,然后查询就是\(gcd(a_l+bit.sum(l), segtree.query(l+1, r))\). 代码: #pragma GCC optimize(2) #pragma GCC o…
给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d. 2.“Q l r”,表示询问 A[l],A[l+1],…,A[r] 的最大公约数(GCD). 对于每个询问,输出一个整数表示答案. 输入格式 第一行两个整数N,M. 第二行N个整数A[i]. 接下来M行表示M条指令,每条指令的格式如题目描述所示. 输出格式 对于每个询问,输出一个整数表示答案. 每个答案占一行. 数据范围 N≤500000,M≤…
网址 https://www.acwing.com/solution/AcWing/content/1590/ 题目描述给定n个区间[l, r]. 合并所有有交集的区间. 输出合并完成后的区间个数. 例如:[1,3]和[2,6]可以合并为一个区间[1,6]. 输入格式第一行包含整数n. 接下来n行,每行包含两个整数 l 和 r. 输出格式共一行,包含一个整数,表示合并区间完成后的区间个数. 样例输入样例:51 22 45 67 87 9输出样例:3 算法1(暴力模拟) O(n2)O(n2)模版题…
(https://www.acwing.com/problem/content/805/) 给定 nn 个区间 [li,ri][li,ri],要求合并所有有交集的区间. 注意如果在端点处相交,也算有交集. 输出合并完成后的区间个数. 例如:[1,3]和[2,6]可以合并为一个区间[1,6]. 输入格式 第一行包含整数n. 接下来n行,每行包含两个整数 l 和 r. 输出格式 共一行,包含一个整数,表示合并区间完成后的区间个数. 数据范围 1≤n≤1000001≤n≤100000,−109≤li≤…
(https://www.acwing.com/problem/content/804/) 假定有一个无限长的数轴,数轴上每个坐标上的数都是0. 现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c. 近下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和. 输入格式 第一行包含两个整数n和m. 接下来 n 行,每行包含两个整数x和c. 再接下里 m 行,每行包含两个整数l和r. 输出格式 共m行,每行输出一个询问中所求的区间内数字和. 数据…
https://www.acwing.com/problem/content/804/ #include <iostream> #include <vector> #include <algorithm> #include<bits/stdc++.h> using namespace std; typedef pair<int, int> PII; ; int n, m; int a[N], s[N]; //a是数字 s是前缀和 vector&l…
//1.将所有区间按左端点从小到大排序 //2.从前往后处理每个区间,判断能否将其放到某个现有的组中 //判断某一组的最后一个区间的右端点是否小于该区间的左端点 //如果大于或等于,就开新组,如果小于,就放到组里去,并更新最后一个区间的右端点 #include <iostream> #include <algorithm> #include <queue> using namespace std; ; int n; struct Range { int l, r; bo…
//1.将所有区间按照左端点从小到大排序 //2.从前往后依次枚举每个区间 //首先选择能够覆盖左端点的区间当中右端点最靠右的端点 //在所有能覆盖start的区间当中,选择右端点最大的区间 //选完之后将start更新成右端点的最大值 #include <iostream> #include <algorithm> using namespace std; ; int n; struct Range { int l, r; bool operator< (const Ran…
//1.将每个区间按右端点从小到大排序 //2.从前往后依次枚举每个区间,如果当前区间中已经包含点,就直接跳过,否则,选择当前区间的右端点 //选右端点的话,可以尽可能的包含在多个区间里 #include <iostream> #include <algorithm> using namespace std; ; int n; struct Range { int l, r; bool operator< (const Range &W)const { return…
#include <iostream> #include <vector> #include <algorithm> using namespace std; typedef pair<int, int> PII; void merge(vector<PII> &segs) { vector<PII> res; sort(segs.begin(), segs.end());//pair排序会优先以左端点排序 int st =…
听书上说有贪心 + 数据结构的做法,研究了一下. 朴素贪心 考虑把所有线段按照右端点 \(b\) 从小到大排序,依次考虑每一条线段的要求: 如果已经满足要求则跳过 否则尽量选择靠后的数(因为之后的线段的右端点都在这条线段的右边,这样容错更高) 所以,我们可以建一个数组,\(d[i]\) 表示 \(i\) 数字是否选择(填\(1\)或\(0\)),扫一遍 \([l, r]\) 区间求和,然后从后往前贪心放数即可. 对于每条线段需要 \(O(r - l + 1)\).所以最坏情况下 \(O(n ^…
给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列{Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R) = (R-L+1) ∗ gcd (Al..Ar). JYY 希望找出权值最大的子序列. Input 输入一行包含一个正整数 N.接下来一行,包含 N个正整数,表示序列Ai1 < =  Ai < =  10^12, 1 < =  N < =  100,000 Output 输出文件包含一行一个正整数,表示权…
数论 2017年3月4日02:11:35 gcd 1. 原理: gcd( a, b ) = gcd( b, a - b ) -> gcd( a, b ) = gcd( b, b % a ) 2. 代码 int gcd( int a, int b ) { if( b == 0 ) return a; return gcd( b, a % b ); } 3. 时间复杂度: O(log n) 4. 预处理 d[3000][3000] 中所有两个数的gcd d[i][j] = d[i][j-i]; 预处…
D. CGCDSSQ time limit per test 2 seconds memory limit per test 256 megabytes Given a sequence of integers a1, ..., an and q queries x1, ..., xq on it. For each query xi you have to count the number of pairs (l, r)such that 1 ≤ l ≤ r ≤ n and gcd(al, a…
题目大意:给定一个长度为 N 的序列,M 个操作,支持区间加,区间查询最大公约数. 题解: 先来看一个子问题,若是单点修改,区间最大公约数,则可以发现,每次修改最多改变 \(O(logn)\) 个答案,且 gcd 可以合并,因此可以直接在线段树上维护. 但是对于区间加来说,无法在已知区间加了某一个数时快速计算出新的区间最大公约数,因此,最坏情况下复杂度可能退化到 \(O(n)\).考虑辗转相除法的性质,\[gcd(x,y,z)=gcd(x,y-x,z-y)\]可以发现,若维护的是原序列的差分序列…
声明 数字对 Time Limits: 2000 ms    Memory Limits: 262144 KB Description 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.  她的面前浮现出一个长度为 n 的序列 {ai},她想找出一段区间 [L, R] (1 <= L <= R <= n). 这个特殊区间满足,存在一个 k (L <= k <= R),并且对于任意的 i (L <= i <= R),ai 都能被 ak 整除.这样的一个特…
题意:给定一个集合,含有n个数.浙理工先生和杭电先生各自有计算这个集合漂亮值的方法. 浙理工先生的计算方法是:对于这个n个数的某个排列,此排列的漂亮值为这个排列全部的区间最大公约数之和.然后这个集合的漂亮值为n个数的全部排列的漂亮值之和. 杭电先生的计算方法是:在这个n个数中选出k(1 ≤ k ≤ n)个数.对于某种选取方案.这样的方案的漂亮值为k个数的最大公约数乘上k.然后这个集合的漂亮值为全部选数方案的漂亮值之和. 然后他们想比比谁得到的漂亮值更大.由于数非常大,所以他们仅仅比較各自的结果对…
题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-,A[r] 都加上 d. "Q l r",表示询问 A[l],A[l+1],-,A[r] 的最大公约数(GCD). 由<九章算术>中的更相减损我们知道gcd(x,y)=gcd(x,y-x)同理可以推到多个整数.(可以用数学归纳法证明) 因此,构造一个长度为N的新数列B,其中B[i…
题面 本题是一道区间最大公约数的模板题: 如果N^2暴力的话当然会超时,所以我们要发掘出区间gcd的特点: 设gcd[i]表示区间[1,i]的最大公约数: 我们可以发现,从一个点i到1之间的所有区间的gcd均满足gcd[j]=GCD(gcd[j-1],a[j]); 由于gcd的性质,所以gcd[]是单调不增的: 接着,我们似乎发现了一个更神奇的事情,g[]中不同的值最多有log(max(a[i]))个: 换句话说,虽然g[]数组的长度为n,但在以上两个条件的限制下,最多仅仅有logA个值发生改变…
题面: 传送门:http://codeforces.com/problemset/problem/475/D Given a sequence of integers a1, -, an and q queries x1, -, xq on it. For each query xi you have to count the number of pairs (l, r) such that 1 ≤ l ≤ r ≤ n and gcd(al, al + 1, -, ar) = xi. 题目大意:…
读入这个坑一直以来都深受其麻烦,把遇到一些注意点记一下吧. 1.getchar读入 以前练线段树的时候做到Acwing#246 Interval GCD(原题在CodeHunter上,人懒就在Acwing上交了),怎么调也调不过去,样例和手造的数据统统没有问题,当时甚至怀疑数据出问题了拿人家题解交了一发,发现过了然后特别自闭,后来整了好久才发现是读入的锅,实测的数据可能没有给的样例那样整齐有序,把 type=getchar(); 改成 do type=getchar(); while(type!…
预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时,可进行区间更新,单点查询,当然想区间查询也有办法(维护两个树状数组即可). 区别 树状数组用来维护一个具有区间可减(加)性质的工具,所以可以用来维护区间前缀和. 区间最值不具有区间可减性,所以不能使用树状数组进行维护,而使用st表. st表的思想 初始化 预处理数组, f[x][i] 表示区间[x…
目录 线段树简介 线段树的简单代码实现 建树代码 修改操作 查询操作 线段树的查询操作的时间复杂度分析: AcWing245. 你能回答这些问题吗 思路 代码[时间复杂度:\(O( \space(N+M)logN)\) ] 错误分析 AcWing246. 区间最大公约数 思路 代码 总结 延迟标记 回顾并查集 概览 AcWing243. 一个简单的整数问题2 总结与反思 代码 扫描线 AcWing247. 亚特兰蒂斯 思路 DeBug 代码 思路解析 AcWing248. 窗内的星星 思路 代码…
点击打开链接 首先给的范围很大,是10^9.暴力解肯定超时(单用for循环到10^9都大约要2s-3s),首先写了个程序暴力的把两个数所有的约数都打印出来,最后发现所有的公约数都是最大公约数的约数,并且最大公约数的约数也一定是两个数的公约数,由此题目转换为求最大公约数的约数的问题,以为输入最大是10^9,所以公约数最大是5*10^8,求这个数的所有约数只需要循环到(跟号5)*10^4,for循环可以轻松应对了,直接用for得到所有的约数,然后qsort排序后,把数组的结构抽象成数轴上的n多个点,…
No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2000    Accepted Submission(s): 851 Problem Description Life is a game,and you lose it,so you suicide. But you can not kill yours…
假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧. 每个小岛都位于海洋一侧的某个点上. 雷达装置均位于海岸线上,且雷达的监测范围为d,当小岛与某雷达的距离不超过d时,该小岛可以被雷达覆盖. 我们使用笛卡尔坐标系,定义海岸线为x轴,海的一侧在x轴上方,陆地一侧在x轴下方. 现在给出每个小岛的具体坐标以及雷达的检测范围,请你求出能够使所有小岛都被雷达覆盖所需的最小雷达数目. 输入格式 第一行输入两个整数n和d,分别代表小岛数目和雷达检测范围. 接下来n行,每行输入两个整数,分别代表小…
题目:https://www.acwing.com/problem/content/222/ 题意:求1-n范围内,gcd(x,y)是素数的对数 思路:首先我们可以针对每个素数p,那么他的贡献应该时   [1,n/p] 互质的对数,这个其实就是遍历这个范围累加每个数的欧拉值,这里我们就可以用个前缀和,然后计算即可 #include<bits/stdc++.h> #define maxn 10000005 #define len 100005 #define mod 1000000007 usi…
一,介绍 ST算法是一个用倍增来求区间最值的算法,倍增是一个与二分类似的思想的一个东西,倍增简而言之也就是区间长度按1,2,4,8..... 我们先用nlog(n)的复杂度打出一个最大值表,后面我们可以通过O(1)的 复杂度来直接得出最大值 二,思路 我们用到F[i][j] 这个含义代表  [i,i+2^j-1]这一段区间的最大值,F[i][j]=max(F[i][j-1],F[i+(1<<(j-1))][j-1]),也就是我拆分成两个区间来求最大值 F[i][0]=a[i]; 我们求最大值,…
我真的是服了,看了一晚上发现居然,,,,, 上图吧,话说有人评论没... 对于结果来说,不一定要枚举有序数列,感觉这是一种猜结果的方法,只不过特别精确,令人发指 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define maxn 110000 #define INF 0x3f3f3f3f using namespace std; double list[…
传送门 题目描述 给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对. GCD(x,y)即求x,y的最大公约数. 输入格式 输入一个整数N 输出格式 输出一个整数,表示满足条件的数对数量. 数据范围 1≤N≤10^7 输入样例: 4 输出样例: 4 题解:本题要求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)数量,相当于求:对于N以内的每一个素数p,1<=x,y<=N/p 中GCD(x,y)为1的数对(x,y)数量和.我们知道欧…