51Nod-1962-区间计数

来源:互联网 发布:mac qq音乐退出登录 编辑:程序博客网 时间:2024/06/09 15:36

ACM模版

描述

描述

题解

官方题解:
描述

代码

#include <iostream>#define mp make_pairusing namespace std;typedef long long ll;typedef pair<int, int> pii;template <class T>inline void scan_d(T &ret){    char c;    ret = 0;    while ((c = getchar()) < '0' || c > '9');    while (c >= '0' && c <= '9')    {        ret = ret * 10 + (c - '0'), c = getchar();    }}const int MAXN = 4e5;int N, now;pii p[MAXN], q[MAXN];int A[MAXN], B[MAXN];int ra[MAXN], rb[MAXN];ll ans;int ins(pii x, pii y){    if (x.second > y.second)    {        swap(x, y);    }    if (x.second < y.first)    {        return 0;    }    return x.second - max(x.first, y.first) + 1;}int main(){    scan_d(N);    for (int i = 1; i <= N; i++)    {        scan_d(A[i]);    }    for (int i = 1; i <= N; i++)    {        scan_d(B[i]);    }    for (int i = N; i >= 1; i--)    {        for (ra[i] = i + 1; ra[i] <= N && A[ra[i]] <= A[i]; ra[i] = ra[ra[i]]) ;        for (rb[i] = i + 1; rb[i] <= N && B[rb[i]] <= B[i]; rb[i] = rb[rb[i]]) ;    }    for (int i = 1; i <= N; i = ra[i])    {        p[A[i]] = mp(i, ra[i] - 1);    }    for (int i = 1; i <= N; i = rb[i])    {        q[B[i]] = mp(i, rb[i] - 1);        now += ins(p[B[i]], q[B[i]]);    }    for (int i = 1; i <= N; i++)    {        ans += now;        now -= ins(p[A[i]], q[A[i]]);        p[A[i]] = mp(0, 0);        if (A[i] != B[i])        {            now -= ins(p[B[i]], q[B[i]]);            q[B[i]] = mp(0, 0);        }        for (int j = i + 1; j < ra[i]; j = ra[j])        {            p[A[j]] = mp(j, ra[j] - 1);            now += ins(p[A[j]], q[A[j]]);        }        for (int j = i + 1; j < rb[i]; j = rb[j])        {            q[B[j]] = mp(j, rb[j] - 1);            now += ins(p[B[j]], q[B[j]]);        }    }    printf("%lld\n", ans);    return 0;}
原创粉丝点击