多校第一场 hdu 5289 Assignment(rmq+二分)
来源:互联网 发布:网络作家的生活 编辑:程序博客网 时间:2024/05/17 01:43
题目链接:
点击打开链接
题目大意:
给出一个序列,问能找出多少个连续区间,区间内最大最小数的差小于k
题目分析:
直接rmq求取,区间最大最小值,枚举每个起点,二分终点,然后对于i点能够满足条件的最远区间到终点,所以贡献r-l+1,求取和就是最后结果
代码如下:
#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#define MAX 100007using namespace std;typedef long long LL;int dp[MAX][20];int dp2[MAX][20];int a[MAX];int n,k;void init (){ for ( int i = 0 ; i < n ; i++ ) dp[i][0] = a[i],dp2[i][0] = a[i]; for ( int j = 1; (1<<j) <= n ; j++ ) for ( int i = 0 ; i + (1<<j)-1 < n ; i++ ) { dp[i][j] = max ( dp[i][j-1] , dp[i+(1<<(j-1))][j-1] ); dp2[i][j] = min ( dp2[i][j-1] , dp2[i+(1<<(j-1))][j-1] ); }}int big ( int l , int r ){ int k = (int)((log(r-l+1)*1.0)/(log(2.0))); return max ( dp[l][k] , dp[r-(1<<k)+1][k] );}int small ( int l , int r ){ int k = (int)((log(r-l+1)*1.0)/(log(2.0))); return min ( dp2[l][k] , dp2[r-(1<<k)+1][k] );}bool check ( int x , int mid , int k ){ return big( x , mid )-small ( x , mid ) < k;}int search ( int x, int k ){ int l = x , r = n-1 , mid; while ( l != r ) { mid = (l+r+1)>>1; if ( check ( x , mid , k )) l = mid; else r = mid-1; } return l;}int t;int main ( ){ scanf ( "%d" , &t ); while ( t-- ) { scanf ( "%d%d" , &n , &k ); for ( int i = 0 ; i < n ; i++ ) scanf ( "%d" , &a[i] ); init(); int i = 0; LL ans = 0; while ( i < n ) { //int x = search ( i , k ); int l = i , r = n-1 , mid; while ( l != r ) { mid = (l+r+1)>>1; if ( check ( i , mid , k )) l = mid; else r = mid-1; } ans += l-i+1; i++; } printf ( "%I64d\n" , ans ); }}
0 0
- 多校第一场 hdu 5289 Assignment(rmq+二分)
- 2015多校联合第一场5289Assignment RMQ+二分
- HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
- [RMQ+二分] 2015多校联合第一场 Assignment
- hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)
- RMQ + 二分_______GCD(hdu 5726 2016多校第一场)
- hdu 5289 Assignment 二分+rmq
- hdu 5289(二分+RMQ) Assignment
- HDU 5289 Assignment【二分+RMQ】
- 【二分+RMQ】hdu 5289 Assignment
- 【多校第一场】【单调队列】HDU 5289 Assignment
- HDU 5289 Assignment(多校联合第一场1002)
- hdu 5289 Assignment(15多校第一场1002)
- HDU 5289 Assignment (RMQ+二分)
- HDU 5289 Assignment (二分+RMQ)
- Hdu-5289 Assignment (二分+RMQ || 单调队列)
- HDU 5289 Assignment(RMQ+二分)
- 2016 多校第一场 hdu 5276((线段树+暴力打表)|(RMQ + 二分))
- 《开发之旅》学习笔记:游戏界面手动打造菜单基础元素
- 情绪管理技巧
- 10个鲜为人知的UX技巧提高产品诱导力
- 如何培养领袖气质
- hdu contest day1 1001 OO’s Sequence
- 多校第一场 hdu 5289 Assignment(rmq+二分)
- 程序的编译、链接与装载
- 宣泄情绪是否可取
- Swift学习笔记(二)字符串和集合类型操作
- STM32f103的数电采集电路的DMA设计和使用优化程序
- 关于使用jekyll+Github搭建自己的博客以及第六天实习记录
- Zookeeper 的学习
- Ubuntu14.04密码正确 进不去桌面系统(已测试恢复正常)
- 【阅读】《head first html5》第三章——事件与处理程序