Solution - P7333 [JRKSJ R1] JFCA
校内模拟赛 T1,恭喜 lijunxi2026 神犇拿下首 A。
思路
一个很水的 Sparse Table + 断环为链。对于一个询问点,直接二分左右就行了。注意要判断距离 \(\le n\)(不能取到自身)。
于是,没了。
代码
#include <bits/stdc++.h>
#define rint register int
#define rllong register long long
#define llong long long
#define N 100005
using namespace std;
int st[N<<1][20], Log2[N<<1];
int a[N<<1];
int n, n2;
#define mid (l+r>>1)
#define len (r-l+1)
inline int query(rint l, rint r){return max(st[l][Log2[len]], st[r-(1<<Log2[len])+1][Log2[len]]);}
inline int solve1(rint l, rint r, rint val){ // To right
if(query(l, r) < val) return -1e9-7;
if(l == r) return l;
if(query(mid+1, r) >= val) return solve1(mid+1, r, val);
else return solve1(l, mid, val);
}
inline int solve2(rint l, rint r, rint val){ // To left
if(query(l, r) < val) return 1e9+7;
if(l == r) return l;
if(query(l, mid) >= val) return solve2(l, mid, val);
else return solve2(mid+1, r, val);
}
int main(){
scanf("%d", &n);
for(rint i = 1; i <= n; ++i)
scanf("%d", &st[i][0]), st[n+i][0] = st[i][0];
for(rint i = 1; i <= n; ++i)
scanf("%d", &a[i]), a[n+i] = a[i];
n2 = n<<1;
for(rint i = 2; i <= n2; ++i)
Log2[i] = Log2[i>>1]+1;
for(rint t = 1; t <= 19; ++t)
for(rint i = 1; i <= n2; ++i){
if(i+(1<<t-1) > n2) continue;
st[i][t] = max(st[i][t-1], st[i+(1<<t-1)][t-1]);
}
for(rint i = 1; i <= n; ++i){
rint res = min(n+i-solve1(1, n+i-1, a[i]), solve2(i+1, n2, a[i])-i);
if(res >= n) printf("-1 ");
else printf("%d ", res);
}
return 0;
}

浙公网安备 33010602011771号