原题链接:Problem - 1548B - Codeforces

解决RMQ(区间最值)问题的算法。

总结的来说求rmq问题有多种方法:线段树,ST表等 线段树预处理O(nlogn),查询O(logn),支持在线修改 ST表预处理O(nlogn),查询O(1),但不支持在线修改

先用st表预处理,然后再使用二分求出最大的区间长度,每次查询一个区间的时候用st表十分方便。

我的二分在这里wa了很多发,注意如果n == 2的时候这个二分是进不了while循环的,所以我单独拿出来处理了;然后这个二分还要想清楚就是,如果在这个区间里没有答案,它就会以最左端点为答案,所以最后还要把得出的l特判一下---->或者,我刚才去试了一下,直接把左端点改为0就万事大吉了(之前是怕左端点为0会出啥问题之类的)。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int, int> PII;
const double pi = acos(-1.0);
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define rrep(i, n) for (int i = n; i >= (1); --i)
typedef long long ll;
#define sqar(x) ((x)*(x))const int N = 2e5 + 10;
ll a[N];
int Log[N];
ll dp[N][21]; //以下标i为起点,区间长度2^j的区间维护的值ll gcd(ll a, ll b)
{return b == 0 ? a : gcd(b, a % b);
}int n;
void init(){
for (int i = 2; i < N; i++)Log[i] = Log[i >> 1] + 1;
}void st() {for (int i = 1; i < n; i++)dp[i][0] = a[i];for (int j = 1; j <= 20; j++){for (int i = 1; i + (1 << j) - 1 <= n - 1; i++) {dp[i][j] = gcd(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);}}
}ll query(int l, int r) {int k = Log[r - l + 1];return gcd(dp[l][k], dp[r - (1 << k) + 1][k]);
}bool check(int x)
{for(int i = x; i < n; i++){if(query(i - x + 1, i) > 1ll) return 1;}return 0;
}int main() {int t;scanf("%d", &t);init();while(t--){scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);if(n == 2){ //n等于2特判一下,因为后面写二分的时候如果n变成1了没进whileif(abs(a[2] - a[1]) == 1) puts("1");else puts("2");continue;}rep(i, n - 1){a[i] = abs(a[i + 1] - a[i]);}st();int l = 1, r = n - 1;int ans = 0;while(l < r){int mid = (l + r + 1) >> 1;if(check(mid)) l = mid;else r = mid - 1;}ans = l;if(!check(l)) ans = 0;printf("%d\n", ans + 1);}return 0;
}

B. Integers Have Friends(cf)二分 + st表相关推荐

  1. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

    题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...

  2. BZOJ3473:字符串(后缀数组,主席树,二分,ST表)

    Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...

  3. Codeforces 359D Pair of Numbers | 二分+ST表+gcd

    题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...

  4. [bzoj5308][二分][ST表]胖

    Description Cedyks是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks是一个富有的男孩子.他住在著名的ThePLace(宫殿)中. Cedyks是一个 ...

  5. 线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)

    文章目录 Rmq Problem / mex Boring Queries Colorful Squares Rmq Problem / mex luogu4137 对aia_iai​建权值线段树 再 ...

  6. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  7. 【CodeForces - 514D】R2D2 and Droid Army(二分+滑动窗口ST表,或 尺取+单调队列或STLmultiset)

    题干: An army of n droids is lined up in one row. Each droid is described by m integers a1, a2, ..., a ...

  8. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  9. 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)

    题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...

最新文章

  1. 程序员都和谁一起睡觉?
  2. 故障解决:error while loading shared libraries: libncurses.so.5
  3. 使用node和npmVS时出现的问题
  4. 关于 Laravel Redis 多个进程同时取队列问题详解
  5. 【VB.NET】VB.NET数据库技术问题的解答
  6. linux修改目录为nobody,nfs只能挂载为nobody的解决方法
  7. java字节字符流实验报告_Java第09次实验(IO流)--实验报告
  8. 计算机普通用户禁止修改c盘,保护C盘数据win7中设置禁止修改C盘文件的方法
  9. 2021年江苏省高考成绩什么时候可以查询,2021年江苏高考成绩什么时候出来 成绩查询时间...
  10. Android 小组件完整案例
  11. css技巧---电子表体字体引入
  12. Rtklib-rinex文件的读取(rinex.c)-序言
  13. 构建虚拟Web主机——基于IP地址的虚拟主机
  14. BZOJ2565最长双回文串——manacher
  15. 面试开课吧合并区间算法
  16. 仪表图形怎么用c语言写,科一仪表盘图标大全
  17. JAVA计算机毕业设计毕业论文答辩管理系统Mybatis+系统+数据库+调试部署
  18. php自动生成后门代码,PHP小后门代码
  19. 大吉大利,今晚吃鸡!
  20. 白魔法师(牛客小白月赛25 图、并查集)

热门文章

  1. win server服务器 关闭危险端口 135,137,138,139,445的方法
  2. 目标检测2——借Detectron2源码理解Anchors与RPN
  3. PHP Class SoapClient not found解决方法
  4. Driller工具分析
  5. Hbase教程(二) Hbase数据库Shell命令
  6. AdaBoost算法讲解、举例
  7. 机器学习之L1正则化和L2正则化(附源码解析)
  8. HTML —— 语义化标签
  9. Jenkins 添加配置Git账号密码凭据
  10. ubuntu16.04登录界面输入用户名密码后又回到登录界面