RMQ+二分 - CF 689D Friends and Subsequences
来源:互联网 发布:代运营淘宝 编辑:程序博客网 时间:2024/05/16 08:52
题目:
Friends and Subsequences
题意:
给A,B两个序列,求
思路:
在所有的区间中求极大/小值,第一反应就应该是二分。
当l为定值,随着x的增大,
有了上面的规律,很容易想到算法:用RMQ做预处理,然后枚举区间左值,二分区间右值,找到两个函数的相交部分即可,因为不是严格递增递减函数,所以相交部分有可能是一段而不仅仅是一个点,所以做两次二分,一次找到相交部分的左端点,一次找到右端点
代码:
#include <bits/stdc++.h>using namespace std;const int maxn = 2e5+10;int dmin[maxn][32], dmax[maxn][32];void RMQ_init(int A[], int B[], int len){ for (int i = 0; i<len; ++i){ dmin[i][0] = A[i]; dmax[i][0] = B[i]; } for (int j = 1; (1 << j) <= len; ++j) for (int i = 0; i + (1 << j) - 1<len; ++i){ dmin[i][j] = min(dmin[i][j - 1], dmin[i + (1 << (j - 1))][j - 1]); dmax[i][j] = max(dmax[i][j - 1], dmax[i + (1 << (j - 1))][j - 1]); } return;}int RMQ_min(int L, int R){ int k = 0; while (1 << (k + 1) <= R - L + 1) k++; return min(dmin[L][k], dmin[R - (1 << k) + 1][k]);}int RMQ_max(int L, int R){ int k = 0; while (1 << (k + 1) <= R - L + 1) k++; return max(dmax[L][k], dmax[R - (1 << k) + 1][k]);}int arr1[maxn], arr2[maxn];int main(){ int n; scanf("%d",&n); for (int i=0;i<n;++i) scanf("%d",arr1+i); for (int i=0;i<n;++i) scanf("%d",arr2+i); RMQ_init(arr2, arr1, n); long long sum = 0; for (int i=0;i<n;++i){ int l = i, r = n-1, res1 = -1, res2 = -1; if (RMQ_min(l,r)>RMQ_max(l,r)) continue; while (l<=r){ int mid = (l+r) >> 1; int minimum = RMQ_min(i,mid), maximum = RMQ_max(i,mid); if (minimum == maximum) res1 = res1 == -1 ? mid : max(res1, mid); if (minimum < maximum) r = mid - 1; else l = mid + 1; } if (res1 == -1) continue; l = i, r = res1, res2 = -1; while (l<=r){ int mid = (l+r) >> 1; int minimum = RMQ_min(i,mid), maximum = RMQ_max(i,mid); if (minimum == maximum) res2 = res2 == -1 ? mid : min(res2, mid); if (minimum <= maximum) r = mid - 1; else l = mid + 1; } sum += res1 - res2 + 1; } cout<<sum<<endl; return 0;}
0 0
- RMQ+二分 - CF 689D Friends and Subsequences
- CF 361 D. Friends and Subsequences (RMQ+二分查找)
- Codeforces 689D Friends and Subsequences(二分+RMQ)
- Codeforces 689D Friends and Subsequences(二分+RMQ)
- Codeforces 689D Friends and Subsequences(RMQ+二分)
- Codeforces 689D Friends and Subsequences (RMQ+二分)
- Codeforces 689D Friends and Subsequences(二分+RMQ)
- 【打CF,学算法——四星级】CodeForces 689D Friends and Subsequences (RMQ+二分)
- Codeforces 689D Friends and Subsequences【思维+二分+RMQ】套路题
- codeforces_689D. Friends and Subsequences(RMQ+二分)
- Cf Round #361 (Div. 2) 689D. Friends and Subsequences
- Codefores 689D. Friends and Subsequences(二分+st)
- [Codeforces 689D] Friends and Subsequences (二分+稀疏表)
- codeforces 689D Friends and Subsequences st表+二分
- Codeforces Round #361 (Div. 2) D. Friends and Subsequences (二分+RMQ)
- CodeForces 689D-Friends and Subsequences
- CodeForces 689D-Friends and Subsequences
- Codeforces 689D Friends and Subsequences
- [Leetcode]345. Reverse Vowels of a String
- js项目实战(弹性预算规则)
- HttpClient+Gson解析中国天气网的天气预报信息
- Remove Invalid Parentheses
- 【51Nod 1239】欧拉函数之和
- RMQ+二分 - CF 689D Friends and Subsequences
- JavaScript-Array 对象及方法(下)
- HDU 2825(Wireless Password-AC自动机+状压dp)
- 关于stc51的冷启动下载和复位
- AsyncHttp+gson解析
- 2016sdau课程练习专题三 1011
- Windows+Visual Studio下生成g2o库教程(结合Cholmod库)
- 分享弹出代码
- 集训第三天