hdu 5289 Assignment(给一个数组,求有多少个区间,满足区间内的最大值和最小值之差小于k)
来源:互联网 发布:网络金融代理招聘信息 编辑:程序博客网 时间:2024/06/11 13:36
1.区间是一段的,不是断开的哟
2.代码是看着标程写的
3.枚举左端点,二分右端点流程:
#include<cstdio>#include<cstring>#include<cmath>#define LL long long#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))using namespace std;const int N=200007;int minn[N][20];//2^18=262144 2^20=1048576int maxx[N][20];//----------------------查询O(1)-------------int queryMin(int l,int r){ int k=floor(log2((double)(r-l+1)));//2^k <= (r - l + 1),floor()向下取整函数 return Min(minn[l][k],minn[r-(1<<k)+1][k]);}int queryMax(int l,int r){ int k=floor(log2((double)(r-l+1))); return Max(maxx[l][k],maxx[r-(1<<k)+1][k]);}//-------------------------------------------------int calc(int l,int r){ int k=log2((double)(r-l+1)); int MAX=Max(maxx[l][k],maxx[r-(1<<k)+1][k]); int MIN=Min(minn[l][k],minn[r-(1<<k)+1][k]); return MAX-MIN;}int main(){ int T; int n,k,i,j,p; LL ans; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); for(i=1; i<=n; ++i) { scanf("%d",&j); minn[i][0]=maxx[i][0]=j; }//------------------------------------------预处理O(nlogn)--------------- for(j=1; (1<<j)<=n; ++j)//1<<j==2^j,枚举区间长度1,2,4,8,16,,,,, for(i=1; i+(1<<j)-1<=n; ++i)//i+(1<<j)-1表示区间右边界,枚举区间左边界 { p=(1<<(j-1)); minn[i][j]=Min(minn[i][j-1],minn[i+p][j-1]); maxx[i][j]=Max(maxx[i][j-1],maxx[i+p][j-1]); }//-----------------------------------------------------------------------//---------------------------枚举左端点,二分右端点--------------------------- int l,r,mid; ans=0;//左端点固定为i,右端点用l,r,mid去确定,最后用l和r中的其中一个,此时l+1==r for(i=1; i<=n; ++i) { l=i,r=n; while(l+1<r) { mid=(l+r)>>1;//(l+r)/2==(l+r)>>1 if(calc(i,mid)<k) { l=mid; } else { r=mid-1;//自己去演示算法流程就知道r可以赋值mid-1 } } if(calc(i,r)<k) { ans=ans+(LL)(r-i+1); } else { ans=ans+(LL)(l-i+1); } }//--------------------------------------------------------------------------- printf("%lld\n",ans); } return 0;}
0 0
- hdu 5289 Assignment(给一个数组,求有多少个区间,满足区间内的最大值和最小值之差小于k)
- hdu 4417 求[l,r]区间内小于v的有多少个
- 【HDU3530】【单调队列(双)】Subsequence 【长度为n的数列,求最长子区间的长度,使得区间的最大值与最小值的差满足一个范围】
- poj3264 Balanced Lineup(求区间的最大值与最小值之差)
- 线段树求区间最大值与最小值的差
- POJ 3264(线段树求区间内最大值和最小值)
- 中国剩余定理 (求某一区间内有多少个解的问题) HDU X问题
- Hdu 5314 Happy King(求树上多少个点对(u,v)满足u到v的路径上点权值最大值减最小值不大于给定的K)
- 区间内有多少个不同的数字(离线树状数组)
- 求一个区间有多少个数能整除k
- hdu 4417 划分树 求一个区间内小于n的数
- 线段树求区间最大值和最小值(指针)
- 线段树离线处理(区间内出现k次的数有多少个)Codeforces Round #136 (Div. 2)
- NYOJ 119 士兵杀敌(三)(线段树—求区间最大值与最小值差)
- 求 区间[a,b]内满足p^k*q*^m(k>m)的数的个数
- 【算法】最大值和最小值的差小于或者等于num的子数组数量
- POJ3264(线段树求区间最大值和最小值)
- acm-1003 求一个数组中连续区间和的最大值问题
- Android Touch事件传递机制
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
- JSon 的使用
- 自动封杀脚本
- 41. First Missing Positive
- hdu 5289 Assignment(给一个数组,求有多少个区间,满足区间内的最大值和最小值之差小于k)
- 关于安卓输入法的设置 使输入法不会遮挡到主界面
- PopupWindow弹出框(自定义弹出框)自定义位置
- 浅谈网络数据包传递过程中涉及的话题[转]
- Mysql所有情况正常,就是没法启动的解决办法
- 硬盘安装Ubuntu
- Python除法
- 在 Eclipse 上开发 Python – PyDev 插件安装教程
- Linux的top命令详细解析