Codeforces 689D Friends and Subsequences(二分+RMQ)
2016-07-08 17:18
465 查看
题意:
给你两个数列a和b,问你其中有多少对l和r使得maxri=lai=minri=lbi。
这个题有一个很正宗要的性质:假设我们固定l,那么对于l到r这个区间内的maxri=lai−minri=lbi≤maxr+1i=lai−minr+1i=lbi,那么也就是说,这个值是有单调性的,所以对于每一个l,我们可以通过二分查找,找到一个rmin和rmax是的上面的值取等号,那么ans+=rmax−rmin+1。对于求那个最大最小可以通过线段树或者是RMQ,线段树的复杂度要到O(n(logn)2可能会被卡常数,所以还是用RMQO(1)查询比较好。
代码:
给你两个数列a和b,问你其中有多少对l和r使得maxri=lai=minri=lbi。
这个题有一个很正宗要的性质:假设我们固定l,那么对于l到r这个区间内的maxri=lai−minri=lbi≤maxr+1i=lai−minr+1i=lbi,那么也就是说,这个值是有单调性的,所以对于每一个l,我们可以通过二分查找,找到一个rmin和rmax是的上面的值取等号,那么ans+=rmax−rmin+1。对于求那个最大最小可以通过线段树或者是RMQ,线段树的复杂度要到O(n(logn)2可能会被卡常数,所以还是用RMQO(1)查询比较好。
代码:
// // Created by CQU_CST_WuErli // Copyright (c) 2016 CQU_CST_WuErli. All rights reserved. // //#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> #include <string> #include <vector> #include <map> #include <queue> #include <stack> #include <set> #include <algorithm> #include <sstream> #define CLR(x) memset(x,0,sizeof(x)) #define OFF(x) memset(x,-1,sizeof(x)) #define MEM(x,a) memset((x),(a),sizeof(x)) #define BUG cout << "I am here" << endl #define lookln(x) cout << #x << "=" << x << endl #define SI(a) scanf("%d", &a) #define SII(a,b) scanf("%d%d", &a, &b) #define SIII(a,b,c) scanf("%d%d%d", &a, &b, &c) const int INF_INT=0x3f3f3f3f; const long long INF_LL=0x7f7f7f7f; const int MOD=1e9+7; const double eps=1e-10; const double pi=acos(-1); typedef long long ll; using namespace std; const int N = 200000 + 100; int n; int a , b ; struct SparseTable { int Max[20] , Min[20] ; void init(int n) { for (int i = 1; i <= n; i++) { Max[0][i] = a[i]; Min[0][i] = b[i]; } for (int i = 1; (1 << i) <= n; i++) { for (int j = 1; j + (1 << i) - 1 <= n; j++) { Max[i][j] = max(Max[i - 1][j], Max[i - 1][j + (1 << (i - 1))]); Min[i][j] = min(Min[i - 1][j], Min[i - 1][j + (1 << (i - 1))]); } } } int RMQ(int l, int r) { int k = 31 - __builtin_clz(r - l + 1); return max(Max[k][l], Max[k][r - (1 << k) + 1]) - min(Min[k][l], Min[k][r - (1 << k) + 1]); } }st; int getMin(int l) { int ans = -1; int L = l, R = n; while (L <= R) { int mid = L + R >> 1; if (st.RMQ(l, mid) >= 0) ans = mid, R = mid - 1; else L = mid + 1; } if (ans == -1) return -1; if (st.RMQ(l, ans) == 0) return ans; else return -1; } int getMax(int l) { int ans = -1; int L = l, R = n; while (L <= R) { int mid = L + R >> 1; if (st.RMQ(l, mid) <= 0) ans = mid, L = mid + 1; else R = mid - 1; } if (ans == -1) return -1; if (st.RMQ(l, ans) == 0) return ans; else return -1; } int main(int argc, char const *argv[]) { #ifdef LOCAL freopen("C:\\Users\\john\\Desktop\\in.txt","r",stdin); // freopen("C:\\Users\\john\\Desktop\\out.txt","w",stdout); #endif while(SI(n) == 1) { for (int i = 1; i <= n; i++) SI(a[i]); for (int i = 1; i <= n; i++) SI(b[i]); st.init(n); ll ans = 0; for (int l = 1; l <= n; l++) { int Rmin = getMin(l); if (Rmin == -1) continue; int Rmax = getMax(l); if (Rmax == -1) continue; ans += Rmax - Rmin + 1; } cout << ans << endl; } return 0; } /* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \| |// `. / \||| : |||// \ / _||||| -:- |||||- \ | | \\ - /// | | | \_| ''\---/'' | | \ .-\__ `-` ___/-. / ___`. .' /--.--\ `. . __ ."" '< `.___\_<|>_/___.' >'"". | | : `- \`.;`\ _ /`;.`/ - ` : | | \ \ `-. \_ __\ /__ _/ .-` / / ======`-.____`-.___\_____/___.-`____.-'====== `=---=' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 永无BUG */
相关文章推荐
- 安装包时遇到 requires a peer of @angular/core、unmet peer dependency...的问题
- Android spannableStringBuilder用法整理
- Easy UI toolbar 使用html的形式添加的按钮分割线
- UICollectionView的使用小记录和一些说明
- ServletRequest.getRequestDispatcher()和ServletContext.getRequestDispather()区别
- 使用RequestUtil解析URL查询参数
- UGUI控件可拖拽移动类组件
- VUE也有自己的日历组件
- 《APUE.3E》用gdb调试ftw函数(图4-22)
- UILabel attributedText的一个坑
- easyui
- easyui的验证
- 浅谈Java设计模式(四)建造者模式(Builder)
- <java.util>PriorityQueue代码分析
- Angular-Ui-Router+ocLazyLoad动态加载脚本
- easyui--datetimebox插件,下拉框的日期不能全部显示,即一个月份中的天数未全部显示
- android测试详解_2-Building Local Unit Tests-本地单元测试
- easyui中datetimebox不显示日期框
- UVA - 10420 List of Conquests
- Codeforces 689 C The Values You Can Make(dp)