当前位置: 首页 > java >正文

Frequent values/gcd区间

Frequent values 

思路: 

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

#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

InputcopyOutputcopy
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了,还要知道最大公因数的运算方法。

#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;
}

http://www.xdnf.cn/news/9207.html

相关文章:

  • 行为型:中介者模式
  • C++11 中引入的`final` 关键字作用。
  • ImageMagick 是默认使用 CPU 来处理图像,也具备利用 GPU 加速的潜力
  • 数据库的事务(Transaction)
  • 路桥隧养护决策系统
  • atomic.Value 中存储的数据是否会被 GC
  • vue展示修改前后对比,并显示修改标注diff
  • 四足机器人环境监测系统相关问题
  • Mac 每日磁盘写入量异常高
  • AI如何颠覆财务预测?——用Python打造自动化智能分析系统
  • 基于Java,SpringBoot,Vue,UniAPP宠物洗护医疗喂养预约服务商城小程序管理系统设计
  • SQL Server 简介和与其它数据库对比
  • 联想小新笔记本电脑静电问题导致无法开机/充电的解决方案
  • 远程控制技术全面解析:找到适合你的最佳方案
  • 北京大学肖臻老师《区块链技术与应用》公开课:03-BTC-数据结构
  • 计算机网络的性能指标
  • 网络协议:[0-RTT 认证 ]
  • 在 LangGraph 中集成 Mem0 记忆系统教程
  • 【HarmonyOS5】Stage模型应用程序包结构详解
  • PDF处理控件Aspose.PDF教程:压缩 PDF 文档的完整指南
  • OpenCV CUDA模块图像处理------颜色空间处理之拜耳模式去马赛克函数demosaicing()
  • 网络套接字基础使用和概念
  • PaddleNLP 的文本分类项目
  • React--》掌握react组件库设计与架构规划
  • PyTorch 中mm和bmm函数的使用详解
  • SMT贴片制造流程关键环节解析
  • 科技趋势分析系统(BBC)技术全解
  • 通用前端框架项目静态部署到Hugging Face Space的实践指南
  • PHP实战:安全实现文件上传功能教程
  • 封装渐变堆叠柱状图组件附完整代码