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;
}
posted @ 2025-04-21 19:38  Hootime  阅读(5)  评论(0)    收藏  举报