
点击查看代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long;
using ll = long long;
typedef pair<int, int> PII;
const int N = 1e5 + 5;
int n, t;
int a[N], max1[N][25], min1[N][25];
int mlog[N];
void init()
{
mlog[0] = -1;
for (int i = 1; i <= N; ++i)
{
mlog[i] = mlog[i >> 1] + 1;
}
for (int i = 1; i <= n; i++)
{
max1[i][0] = min1[i][0] = a[i];
}
int p = mlog[n];
for (int k = 1; k <= p; ++k)
{
for (int s = 1; s + (1 << k) - 1 <= n; s++)
{
max1[s][k] = max(max1[s][k - 1], max1[s + (1 << (k - 1))][k - 1]);
min1[s][k] = min(min1[s][k - 1], min1[s + (1 << (k - 1))][k - 1]);
}
}
}
int solve(int l, int r)
{
int k = mlog[r - l + 1];
int l1 = r - (1 << k) + 1;
int max2 = max(max1[l][k], max1[l1][k]);
int min2 = min(min1[l][k], min1[l1][k]);
return max2 - min2;
}
int main()
{
cin >> n >> t;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
}
init();
while (t--)
{
int l, r;
cin >> l >> r;
cout << solve(l, r) << "\n";
}
return 0;
}

点击查看代码
#include <bits/stdc++.h>
using namespace std;
using i64 = long;
using ll = long long;
typedef pair<int, int> PII;
const int N = 1e5 + 5;
int n, t;
int a[N], max1[N][25], min1[N][25];
int mlog[N];
void init()
{
mlog[0] = -1;
for (int i = 1; i <= N; ++i)
{
mlog[i] = mlog[i >> 1] + 1;
}
for (int i = 1; i <= n; i++)
{
max1[i][0] = min1[i][0] = a[i];
}
int p = mlog[n];
for (int k = 1; k <= p; ++k)
{
for (int s = 1; s + (1 << k) <= n + 1; s++)
{
max1[s][k] = __gcd(max1[s][k - 1], max1[s + (1 << (k - 1))][k - 1]);
min1[s][k] = min(min1[s][k - 1], min1[s + (1 << (k - 1))][k - 1]);
}
}
}
int solve(int l, int r)
{
int k = mlog[r - l + 1];
int l1 = r - (1 << k) + 1;
int max2 = __gcd(max1[l][k], max1[l1][k]);
int min2 = min(min1[l][k], min1[l1][k]);
return max2;
}
int main()
{
cin >> n >> t;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
}
init();
while (t--)
{
int l, r;
cin >> l >> r;
cout << solve(l, r) << "\n";
}
return 0;
}
这道题的其他地方与第一题一样,但为什么可以用gcd呢,因为里面的元素是可以重复运算的,被举个例子,3,6,12,24,假设我们要求1-3的区间的最大公约数,首先,gcd[i][0]都是其本身,而gcd[1][1]为3跟6比较,而gcd[2][1]为6跟12比较,此时,6比较了两次,但是3跟6的最大公约数与6跟12的最大公约数其实就相当于里面三个数的最大公约数。加入把3改成2,gcd(2,3)=1,gcd(3,6)=3,而gcd(1,3)=1答案还是正确的。所以st算这题是没问题的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】