玲珑杯round#19B 1149 Buildings
来源:互联网 发布:长城宽带 端口转发 编辑:程序博客网 时间:2024/06/05 20:57
题意:给出一个数列和k,求出满足[L,R]区间中最大的数减去最小的数<= k的区间数。
思路:
注意到固定l之后,随着r的右移,[l,r]的最大值越来越大,[l,r]的最小值越来越小,故max(hl,…,hr)−min(hl,…,hr)是单调递增的。
二分得到r的最大值,答案加上r−l+1。
用ST表维护O(1)查询区间最值。
时间复杂度O(nlogn)。
#include<bits/stdc++.h>using namespace std;const int maxn = 2e5 + 10;#define INF 0x3f3f3f3ftypedef pair<int,int> P;typedef long long ll;int a[maxn];int n,k;int dp1[maxn][20],dp2[maxn][20];void Init(){ for(int i = 1; i <= n; i ++) dp1[i][0] = dp2[i][0] = a[i]; for(int j = 1; (1 << j) <= n; j ++) { for(int i = 1; i + (1 << j) - 1 <= n; i ++) { dp1[i][j] = max(dp1[i][j - 1],dp1[i + (1 << (j - 1))][j - 1]); dp2[i][j] = min(dp2[i][j - 1],dp2[i + (1 << (j - 1))][j - 1]); } }}int query1(int L,int R){ int k = 0; while(1 << (k + 1) <= (R - L + 1)) k ++; return max(dp1[L][k],dp1[R - (1 << k) + 1][k]);}int query2(int L,int R){ int k = 0; while( (1 << (k + 1)) <= (R - L + 1)) k ++; return min(dp2[L][k],dp2[R - (1 << k) + 1][k]);}int main(){ while( ~ scanf("%d%d",&n,&k)) { for(int i = 1; i <= n; i ++) scanf("%d",&a[i]); Init(); ll ans = 0; for(int i = 1; i <= n; i ++) { int cnt = 0; int l = i,r = n; int pos = l; while(l <= r) { int mid = (l + r) / 2; int val = query1(i,mid) - query2(i,mid); if(val <= k) { pos = mid;l = mid + 1; } else { r = mid - 1; } } ans += (ll)(pos - i + 1); } printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- 玲珑杯round#19B 1149 Buildings
- “玲珑杯”ACM比赛 Round #19 B.Buildings【二分+RMQ】
- [ifrog] Round #19 B -- Buildings
- 玲珑杯” Round #19 Buildings 【线段树+尺取法】+【vector + 尺取法】
- 玲珑杯-Round #7.B-1072-Capture
- 【玲珑杯 Round#13 B】 【倍增+二分】
- 玲珑杯 Round 19 1152
- “玲珑杯”ACM比赛 Round #19 B(RMQ大法好啊,比线段树快得多!!!!)
- “玲珑杯”ACM比赛 Round #4 B Best couple
- 二分+倍增思想 “玲珑杯”ACM比赛 Round #13/B
- “玲珑杯”ACM比赛 Round #19
- “玲珑杯”Round #11
- 玲珑杯 Round #20
- 玲珑学院OJ 1149-Buildings-(RMQ+二分)
- “玲珑杯”ACM比赛 Round #13 B -- 我也不是B,倍增+二分!
- 玲珑杯 #round 9 1084
- 玲珑杯round#11 ----A
- 玲珑杯round #18 1147
- UVa10391(拆分)
- malloc函数两个使用实例
- 安卓隐藏键盘与点击空白区域隐藏键盘
- tensorflow教程学习三深入MNIST
- 走迷宫——DFS
- 玲珑杯round#19B 1149 Buildings
- [leetcode]166. Fraction to Recurring Decimal
- Errors reported here must be corrected before the service can be started.
- 复盘_7月(第5周工作复盘)
- mac下node安装提示command not found
- 解决问题的记录【一】TCP连接过多导致新连接创建失败
- 用数组模拟栈结构,实现分隔符"{}"、"()"、"[]"的左右匹配检查
- android kotlin 一键配置 附anko
- 填制模具充程模拟Siemens.NX.11.0.Easy.Fill.Advanced.v5_20170720