P7333 [JRKSJ R1] JFCA(st表)
由于本题是一个环,所以可以开三倍的空间,要找i就可以转化成i+n,然后从前后查找(之前没遇到过,可以积累),本体的核心就是st表的处理和二分查找,我原本想直接用二分查找寻找[1,pos-1]和[pos+1,3*n]中>=b[i]并且与pos最近的值,但发现值的大小不是有序排列,所以不行,但是我们可以二分查找与pos的距离mid
如果区间的最大值>=b[i],说明我们需要缩小距离让end=mid-1,反之要增大空间让begin=mid+1;这里要注意的是end不能等于n,如果等于n的话并且查找不到>=b[i]的值,mid会越来越大直到等于end也就是n,这时候区间[pos-n,pos-1],[pos+1,pos+n];就会包括pos点,因为a[pos][0]=a[pos-n][0]a[pos+n][0];
#include<iostream>
#include<set>
#include<map>
#include<algorithm>
#include<vector>
#include<cmath>
#define int long long
const int N = 1e6;
using namespace std;
char* p1, * p2, buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
int x = 0, f = 1;
char ch = nc();
while (ch < 48 || ch>57)
{
if (ch == '-')
f = -1;
ch = nc();
}
while (ch >= 48 && ch <= 57)
x = x * 10 + ch - 48, ch = nc();
return x * f;
}
int a[N][20], b[N];
int n;
int query(int left,int right) {
int len = log2(right - left + 1);
return max(a[left][len], a[right - (1 << len) + 1][len]);
}
int find(int pos, int value) {
int begin = 1, end = n-1,f=-1;
while (begin <= end) {
int mid = (begin + end) >> 1;//mid代表的是与pos的距离,所以end和begin的变化与平时不一样
if (max(query(pos-mid, pos - 1), query(pos + 1, pos+ mid)) >= value){
f = mid;
end = mid-1;
}
else {
begin = mid+1;
}
}
return f;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i][0];
a[i + n][0] = a[i + 2 * n][0] = a[i][0];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
int len = log2(n-1+1);
for (int i = 1; i <= len; i++) {//预处理st表
for (int j = 1; j + (1<<i) - 1 <= 3 * n; j++) {//注意是3n
a[j][i] = max(a[j][i - 1], a[j + (1 << (i-1))][i - 1]);
}
}
for (int i = 1; i <= n; i++) {
cout<<find(i + n, b[i])<<" ";//是i+n这样才能从前后分别查找
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理