codeforces_689D. Friends and Subsequences(RMQ+二分)

D. Friends and Subsequences
time limit per test
2 seconds
memory limit per test
512 megabytes
input
standard input
output
standard output

Mike and !Mike are old childhood rivals, they are opposite in everything they do, except programming. Today they have a problem they cannot solve on their own, but together (with you) — who knows?

Every one of them has an integer sequences a and b of length n. Being given a query of the form of pair of integers (l, r), Mike can instantly tell the value of  while !Mike can instantly tell the value of .

Now suppose a robot (you!) asks them all possible different queries of pairs of integers (l, r) (1 ≤ l ≤ r ≤ n) (so he will make exactlyn(n + 1) / 2 queries) and counts how many times their answers coincide, thus for how many pairs  is satisfied.

How many occasions will the robot count?

Input

The first line contains only integer n (1 ≤ n ≤ 200 000).

The second line contains n integer numbers a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — the sequence a.

The third line contains n integer numbers b1, b2, ..., bn ( - 109 ≤ bi ≤ 109) — the sequence b.

Output

Print the only integer number — the number of occasions the robot will count, thus for how many pairs  is satisfied.

Examples
input
6
1 2 3 2 1 4
6 7 1 2 3 2
output
2
input
3
3 3 3
1 1 1
output
0
Note

The occasions in the first sample case are:

1.l = 4,r = 4 since max{2} = min{2}.

2.l = 4,r = 5 since max{2, 1} = min{2, 3}.

There are no occasions in the second sample case since Mike will answer 3 to any query pair, but !Mike will always answer 1.

RMQ找出最大最小值,两次二分找出相等的区间,其中一次找右端点靠左的,另一次找靠右的,减去即可得到此次所得相等区间个数
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define FOP freopen("data.txt","r",stdin)
#define inf 0x3f3f3f3f
#define maxn 200010
#define mod 1000000007
#define PI acos(-1.0)
#define LL long long
using namespace std;

int n;
int a[maxn], b[maxn];
int ma[maxn][20], mi[maxn][20];

void RMQ_init(){
    memset(ma, 0, sizeof(ma));
    memset(mi, 0, sizeof(mi));
    for(int i = 0; i < n; i++){
        ma[i][0] = a[i];
        mi[i][0] = b[i];
    }

    for(int j = 1; (1<> 1;
            if(RMQ_ma(i, mid) < RMQ_mi(i, mid)){
                l = mid + 1;
            }
            else if(RMQ_ma(i, mid) > RMQ_mi(i, mid)){
                r = mid - 1;
            }
            else if(RMQ_ma(i, mid) == RMQ_mi(i, mid)){
                t1 = mid;
                r = mid -1;
            }
        }
        if(t1 == -1)continue;
        l = i, r = n - 1;
        while(l <= r){
            int mid = l + r >> 1;
            if(RMQ_ma(i, mid) < RMQ_mi(i, mid)){
                l = mid + 1;
            }
            else if(RMQ_ma(i, mid) > RMQ_mi(i, mid)){
                r = mid - 1;
            }
            else if(RMQ_ma(i, mid) == RMQ_mi(i, mid)){
                t2 = mid;
                l = mid + 1;
            }
        }
        ans += t2 - t1 + 1;
    }
    printf("%lld\n", ans);
    return 0;
}


你可能感兴趣的:(cf,二分,---RMQ)