Frequent values/gcd区间

Frequent values

思路:

这题它的数据是递增的,ST表,它的最多的个数只会在在两个区间本身就是最多的或中间地方产生,所以我用map数组储存每个值的左右临界点,在ST表时比较多一个比较中间值的个数就Ok了。

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define MAX0 16+1
typedef pair<int, int> pii;
pii a[100001][MAX0];
int Log[100001];
map<int, pii>p;
int n, m, l, r;
pii MAXX(pii x, pii y) {
    return x.second > y.second ? x : y;
}
void ChuLog() {
    Log[1] = 0;
    Log[2] = 1;
    for (int i = 3; i <= n; i++) {
        Log[i] = Log[i >> 1] + 1;
    }
}
void ChuST() {
    for (int j = 1; j <= Log[n]; j++) {
        for (int i = 1; i + (1 << j) - 1 <= n; i++) {
            a[i][j] = MAXX(a[i][j - 1], a[i + (1 << (j - 1))][j - 1]);
            pii o = p[a[i + (1 << (j - 1))][0].first];
            a[i][j] = MAXX(a[i][j], { a[i + (1 << (j - 1))][0].first,((i + (1 << j) - 1 > o.second ? o.second : i + (1 << j) - 1) - (i > o.first ? i : o.first) + 1) });
        }
    }
}
int main() {
    ios::sync_with_stdio(false);        // 禁用同步
    cin.tie(nullptr);                   // 解除cin与cout绑定
    cin >> n;
    while(n){
        cin >> m;
        int x;
        for (int i = 1; i <= n; i++) {
            cin >> a[i][0].first;
            a[i][0].second = 1;
            if (i == 0) {
                x = i;
            }
            else {
                if (a[i][0].first != a[i - 1][0].first) {
                    p[a[i - 1][0].first] = { x, (i - 1) };
                    x = i;
                }
            }
        }
        p[a[n][0].first] = { x, n };
        ChuLog();
        ChuST();
        while (m--) {
            cin >> l;
            cin >> r;
            int q = Log[r - l + 1];
            pii ww = MAXX(a[l][q], a[r - (1 << q) + 1][q]);
            pii o = p[a[r - (1 << q) + 1][0].first];
            ww = MAXX(ww, { a[r - (1 << q) + 1][0].first,((r > o.second ? o.second : r) - (l > o.first ? l : o.first) + 1) });
            cout << ww.second << endl;
        }
        cin >> n;
    }
    return 0;
}

gcd区间

Description

给定 nn 个正整数 a1,a2,...,an。

mm 次询问,每次询问给定一个区间 l,r,输出 al,al+1,...,ar 的最大公因数。

Input

第一行两个整数 n,m。

第二行 n 个整数表示 a1,a2,...,an。

以下 m行,每行两个整数 l,r 表示询问区间的左右端点。

Output

共 mm 行,每行表示一个询问的答案。

Sample 1

Inputcopy Outputcopy
5 3 4 12 3 6 7 1 3 2 3 5 5 1 3 7

Hint

  • 对于 30% 的数据,1≤n≤100,1≤m≤10;
  • 对于 60% 的数据,1≤m≤1000;
  • 对于 100% 的数据,1≤l≤r≤n≤1000,1≤m≤1061≤m≤106。

思路 :

就是简单的ST表题,但还要知道的是三个数的最大公因数就是两个数的最大公因数和第三个数的最大公因数,依次类推就ok了,还要知道最大公因数的运算方法。

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define MAX0 9+1
int a[1001][MAX0];
int Log[1001];
int n, m, l, r;
int gcd(int i, int j) {
    int c;
    while (i % j != 0) {
        c = i % j;
        i = j;
        j = c;
    }
    return j;
}
void ChuLog() {
    Log[1] = 0;
    Log[2] = 1;
    for (int i = 3; i <= n; i++) {
        Log[i] = Log[i >> 1] + 1;
    }
}
void ChuST() {
    for (int j = 1; j <= Log[n]; j++) {
        for (int i = 1; i + (1 << j) - 1 <= n; i++) {
            a[i][j] = gcd(a[i][j - 1], a[i + (1 << (j - 1))][j - 1]);
        }
    }
}
int main(){
	ios::sync_with_stdio(false);        // 禁用同步
    cin.tie(nullptr);                   // 解除cin与cout绑定
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i][0];
    }
    ChuLog();
    ChuST();
    for (int i = 0; i < m; i++) {
        cin >> l >> r;
        int q = Log[r - l + 1];
        cout << gcd(a[l][q], a[r - (1 << q) + 1][q]) << endl;
    }
    return 0;
}
相关推荐
淡海水8 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan9 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy10 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息10 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
木井巳12 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊12 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥12 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
shehuiyuelaiyuehao13 小时前
算法34,位运算符操作,总结
算法
Navigator_Z13 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z13 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode