样例过了,其他没过,求调
查看原帖
样例过了,其他没过,求调
1210083
spidermanbaout楼主2024/12/11 23:21
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <iomanip>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <numeric>
#include <cstring>
#include <unordered_map>
#include <cmath>
#include <climits>
#define endl '\n'
#define int long long
using namespace std;
const int N = 2e6 + 10;
int f[N][32];
int a[N],b[N];
int lg2(int x)
{
	int cnt = 0;
	while ((1 << cnt) <= (x >> 1)) cnt++;
	return cnt;
}
int query(int l, int r)
{
	int k = lg2(r - l + 1);
	return max(f[l][k], f[r - (1 << k) + 1][k]);
}
void solve()
{
	int n;
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
		a[i + n] = a[i];
	}
	for (int i = 1; i <= n; i++) cin >> b[i];
	int e = (n << 1);
	int power = lg2(e);
	for (int i = 1; i <= e; i++)
	{
		f[i][0] = a[i];
	}
	for(int p=1;p<=power;p++)
		for (int i = 1; i<= e; i++)
		{
			f[i][p] = max(f[i][p - 1],f[i + (1 << (p - 1))][p - 1]);
		}
	for (int i = 1; i <= n; i++)
	{
		if (query(i + 1, i + n - 1) < b[i]) { cout << -1 << ' '; continue; }
		int l1 = i + 1, r1 = (n - 1) / 2 + i, l2 = (n - 1) / 2 + i + 1, r2 = n + i - 1;
		for (int p = power; p >= 0; p--)
		{
			if (l1 + (1 << p) - 1 <= r1 && f[l1][p] < b[i]) l1 += (1 << p);
		}
		for (int p = power; p >= 0; p--)
		{
			if (l2 + (1 << p) - 1 <= r2 && f[l2][p] < b[i]) l2 += (1 << p);
		}
		if (l1>r1) cout  << n + i - l2;
		else if (l2>r2) cout  << l1 - i;
		else cout << min(l1 - i, n + i - l2);
		cout << ' ';
	}
}
signed main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int T = 1;
	//cin >> T;
	while (T--)
		solve();
}
2024/12/11 23:21
加载中...