区间计数
来源:互联网 发布:mac photoshop 破解版 编辑:程序博客网 时间:2024/06/06 04:00
两个数列
注:[ ]内表达式为真,则为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示例
51 4 2 3 43 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;}
阅读全文
0 0
- 区间计数
- 排列组合&区间计数
- Codeforces149D(计数区间dp)
- 处理区间计数问题
- 【51Nod1962】区间计数
- 【模板】快速区间素数计数
- 51Nod-1962-区间计数
- 51nod 1962 区间计数
- hiho 1483 区间计数问题+二分答案
- 单调栈 51nod 1962 区间计数
- 【区间计数】Milking Cows 挤牛奶 (milk2) Usaco_Training 1.2
- UVA 1362 - Exploring Pyramids(计数问题+区间DP)
- UVALive 3516 Exploring Pyramids 区间dp+计数原理
- POJ 2282-The Counting Problem(组合数学_区间计数)
- LeetCode 327. Count of Range Sum(区间和计数)
- CF 665E 限制异或和的区间计数
- dp 计数问题 复杂整数划分 区间dp
- HDU:4883 TIANKENG’s restaurant(区间计数)
- spring in action 学习笔记(七)注入内部bean
- Go实战--golang中操作excel(tealeg/xlsx、360EntSecGroup-Skylar/excelize)
- linux 更新node
- c# 转换json
- 简单进程池实现代码(共享内存为通信形式)
- 区间计数
- Algorithm-week6
- Fiddler教程(Web调试工具)
- HTML5新增结构元素
- c++ vector
- 进程和线程的区别
- mapreduce的任务切片规划机制、job提交流程、Mapreduce中的分区Partitioner与流量汇总程序开发
- 关于Qt Creater中资源文件和文件路径的记录
- CF round#439 div.2 C The Intriguing Obsession【DP】