样例过了,WA第三个点
查看原帖
样例过了,WA第三个点
627632
live_cxy110122楼主2024/7/25 20:32
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e5 + 7;

int M1[N][63], M2[N][63], n, ans;

void st_RMQ1()
{
	int len = log2(n);
	for(int j = 1; j <= len; j++)
		for(int i = 0; i + (1 << j) - 1 <= n; i++)
			M1[i][j] = max(M1[i][j-1], M1[i + (1 << (j - 1))][j - 1]);
}

void st_RMQ2()
{
	int len = log2(n);
	for(int j = 1; j <= len; j++)
		for(int i = 0; i + (1 << j) - 1 <= n; i++)
			M2[i][j] = min(M2[i][j-1], M2[i + (1 << (j - 1))][j - 1]);
}

int RMQ(int l, int r, int M[][63])
{
	int k = log2(r - l + 1);
	return max(M[l][k], M[r - (1 << k) + 1][k]);
}

signed main()
{
    ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	cin>>n;
	for(int i = 1; i <= n; i++)
		cin>>M1[i][0];
	for(int i = 1; i <= n; i++)
		cin>>M2[i][0];
	st_RMQ1();
	st_RMQ2();
    for(int i = 1; i <= n; i++)
    {
        int l = i, r = n;
        while(l < r)
        {
            int mid = (l + r + 1) >> 1;
            if(RMQ(i, mid, M1) <= RMQ(i, mid, M2))
                l = mid;
            else
                r = mid - 1;
        }
        int tr = l;
        l = i, r = n;
        while(l < r)
        {
            int mid = (l + r) >> 1;
            if(RMQ(i, mid, M1) >= RMQ(i, mid, M2))
                r = mid;
            else
                l = mid + 1;
        }
        if(l == 0 || tr == 0)
            continue;
        if(RMQ(i, tr, M1) == RMQ(i, tr, M2) && RMQ(i, l, M1) == RMQ(i, l, M2) && l <= n && r > 0)
            ans += tr - l + 1;
    }
    cout<<ans;
	return 0;
}
2024/7/25 20:32
加载中...