区间计数

发布时间:2024-11-28 01:34

分区设计,区分公共区域和个人空间。 #生活技巧# #园艺绿化建议# #绿化美化设计#

区间计数

最新推荐文章于 2024-04-08 20:28:12 发布

brucehb 于 2017-10-09 13:09:39 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

两个数列  ,  ,请求出Ans, Ans定义如下:

注:[ ]内表达式为真,则为1,否则为0.

样例解释:

7个区间分别为:(1,4),(1,5),(2,4),(2,5),(3,3),(3,5),(4,5)

Input

第一行一个整数N 第二行N个整数Ai 第三行N个整数Bi

Output

一行,一个整数Ans

Input示例

5 1 4 2 3 4 3 2 2 4 1

Output示例

7

#include <iostream>

#include <stack>

#include <stdio.h>

using namespace std;

typedef long long int ll;

const int MAXN = 350005;

int a[MAXN];

int b[MAXN];

int n;

struct node

{

node()

{

val = 0;

num = 0;

}

node(int v, int n)

{

val = v;

num = n;

}

int val;

int num;

};

node prevMax[MAXN];

int bufA[MAXN];

int bufB[MAXN];

int find(int *p, int *q, int pos, int k)

{

int left = 0;

int right = pos;

int result = -1;

while (left < right-1)

{

int mid = left + (right-left)/2;

if (p[q[mid]] <= k)

{

right = mid;

}

else

{

left = mid;

}

}

if (p[q[right]] > k)

{

result = right;

}

else if (p[q[left]] > k)

{

result = left;

}

return result;

}

int main()

{

cin >> n;

ll result = 0;

for (int i = 0; i < n; i++)

{

cin >> a[i];

}

for (int i = 0; i < n; i++)

{

cin >> b[i];

}

ll sum = 0;

int p = -1;

int q = -1;

int r = -1;

for (int i = 0; i < n; i++)

{

int maxInput = max(a[i], b[i]);

while ((r >= 0) && (maxInput >= prevMax[r].val))

{

sum -= prevMax[r].num;

r--;

}

if ((p >= 0) && a[i] >= a[bufA[p]])

{

p = find(a, bufA, p, a[i]);

}

p++;

bufA[p] = i;

if ((q >= 0) && b[i] >= b[bufB[q]])

{

q = find(b, bufB, q, b[i]);

}

q++;

bufB[q] = i;

bool equal = false;

if (a[i] > b[i])

{

q = find(b, bufB, q, a[i]);

if (b[bufB[q+1]] == a[i])

{

q++;

equal = true;

}

}

else if (a[i] < b[i])

{

p = find(a, bufA, p, b[i]);

if (a[bufA[p+1]] == b[i])

{

p++;

equal = true;

}

}

else

{

equal = true;

}

if (equal)

{

int rightA = bufA[p];

int rightB = bufB[q];

int right = min(rightA, rightB);

int value = a[bufA[p]];

int leftA = (p == 0)? -1 : bufA[p-1];

int leftB = (q == 0)? -1 : bufB[q-1];

int left = max(leftA, leftB);

int num = (right-left);

sum += num;

r++;

prevMax[r] = node(value, num);

}

result += sum;

}

cout << result << endl;

return 0;

}

网址:区间计数 https://www.yuejiaxmz.com/news/view/294592

相关内容

python bins分箱,划分数值区间
办公空间怎么进行功能分区?不同空间设计功能分区
打造数字生活“新入口”,数字社区加速推动数实融合
数字化阅读空间
文三数字生活街区首届“勇电杯”3D打印创新设计大赛
大数据统计:过去十年中被证实的十大膳食健康误区
‎数字社区
优化养老社区空间设计,提升老年人安全感
智慧社区健康大数据分析简述
家居空间新定义:创新设计,打造多功能生活区

随便看看