B. Integers Have Friends(cf)二分 + st表
原题链接: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表相关推荐
- BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】
题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...
- BZOJ3473:字符串(后缀数组,主席树,二分,ST表)
Description 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? Input 第一行两个整数n,k. 接下来n行每行一个字符串. Output 一 ...
- Codeforces 359D Pair of Numbers | 二分+ST表+gcd
题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...
- [bzoj5308][二分][ST表]胖
Description Cedyks是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks是一个富有的男孩子.他住在著名的ThePLace(宫殿)中. Cedyks是一个 ...
- 线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)
文章目录 Rmq Problem / mex Boring Queries Colorful Squares Rmq Problem / mex luogu4137 对aia_iai建权值线段树 再 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 【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 ...
- 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]
题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...
- 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)
题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...
最新文章
- 程序员都和谁一起睡觉?
- 故障解决:error while loading shared libraries: libncurses.so.5
- 使用node和npmVS时出现的问题
- 关于 Laravel Redis 多个进程同时取队列问题详解
- 【VB.NET】VB.NET数据库技术问题的解答
- linux修改目录为nobody,nfs只能挂载为nobody的解决方法
- java字节字符流实验报告_Java第09次实验(IO流)--实验报告
- 计算机普通用户禁止修改c盘,保护C盘数据win7中设置禁止修改C盘文件的方法
- 2021年江苏省高考成绩什么时候可以查询,2021年江苏高考成绩什么时候出来 成绩查询时间...
- Android 小组件完整案例
- css技巧---电子表体字体引入
- Rtklib-rinex文件的读取(rinex.c)-序言
- 构建虚拟Web主机——基于IP地址的虚拟主机
- BZOJ2565最长双回文串——manacher
- 面试开课吧合并区间算法
- 仪表图形怎么用c语言写,科一仪表盘图标大全
- JAVA计算机毕业设计毕业论文答辩管理系统Mybatis+系统+数据库+调试部署
- php自动生成后门代码,PHP小后门代码
- 大吉大利,今晚吃鸡!
- 白魔法师(牛客小白月赛25 图、并查集)