UVALive_6609_Minimal Subarray Length(RMQ+二分)
来源:互联网 发布:开源java点餐系统 编辑:程序博客网 时间:2024/06/04 19:41
题型:数据结构
题意:在n个数中求出最短连续序列,是的序列之和大于等于X。
分析:
一开始想是单调队列,或者单纯的二分,但是由于数据有正有负,所以其前缀和sum数组并没有单调性,所以这个方法不行。
后来想到,对sum数组,要求有这样的解,sum[j] - sum[i] ≥ x
枚举起点i,然后二分区间[i+1,n],每次用l到mid之间的sum最大值减去sum[i]看是否≥ x。
如果成立,说明左区间存在答案,那么往左边二分;
如果不成立,就是说连左区间的最大值都不能满足答案,那么左区间根部不存在答案,那么就往右区间二分。
然后更新最短长度的答案。
复杂度O(nlog(n))
代码:
#include<cstdio>#include<algorithm>using namespace std;typedef long long LL;const LL inf=0x3f3f3f3f3f3f3f3fLL;const int M=5e5+10;class Range_Maximum_Query{ int LOG[M]; LL dpmax[M][20],dpmin[M][20];public: void init(){ LOG[0]=-1; for(int i=1;i<M;i++){ LOG[i]=LOG[i>>1]+1; } } void Make_RMQ(int n,LL a[]){ for(int i=1;i<=n;i++){ dpmax[i][0]=dpmin[i][0]=a[i]; } for(int j=1;j<=LOG[n];j++){ for(int i=1;i+(1<<j)-1<=n;i++){ dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]); dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]); } } } LL get_RMQ(int a,int b,bool big){ int k=LOG[b-a+1]; if(big) return max(dpmax[a][k],dpmax[b-(1<<k)+1][k]); return min(dpmin[a][k],dpmin[b-(1<<k)+1][k]); }}rmq;LL a[M],sum[M];int main(){ int t,n,m; rmq.init(); while(~scanf("%d",&t)){ while(t--){ scanf("%d%d",&n,&m); sum[0]=0; for(int i=1,in;i<=n;i++){ scanf("%d",&in); a[i]=in; sum[i]=sum[i-1]+a[i]; } rmq.Make_RMQ(n,sum); int ans=0x3f3f3f3f; for(int i=1;i<=n;i++){ int L=i,R=n; while(L<=R){ int mid=(L+R)>>1; LL big=rmq.get_RMQ(i,mid,1); if(big-sum[i-1]>=m){ ans=min(ans,mid-i+1); R=mid-1; } else{ L=mid+1; } } } if(ans==0x3f3f3f3f) ans=-1; printf("%d\n",ans); } } return 0;}
0 0
- UVALive_6609_Minimal Subarray Length(RMQ+二分)
- UVALive 6609 Minimal Subarray Length rmq+二分or单调队列
- HOJ 13006 Minimal Subarray Length (单调队列或RMQ加二分)
- UVALive 6609(Minimal Subarray Length)维护递增序列|RMQ
- Minimal Subarray Length
- LA 6609 - Minimal Subarray Length
- Maximum Length of Repeated Subarray
- Maximum Length of Repeated Subarray
- Maximum Length of Repeated Subarray
- POJ 2452 RMQ+二分
- hdu 3486 RMQ + 二分
- HDU 3603 二分+RMQ
- hdu3486 RMQ+二分
- ZOJ 3726 RMQ + 二分
- codeforces6E Exposition 二分+RMQ
- RMQ+二分 hdu5289 Assignment
- POJ 2452 (RMQ + 二分)
- hdoj3486Interviewe【RMQ+二分枚举】
- linux shell 不同进制数据转换
- 使用Phoneix踩过的坑
- APK反编译之一:基础知识--smali文件阅读
- 总结使用Unity 3D优化游戏运行性能的经验
- qwt的编译与安装
- UVALive_6609_Minimal Subarray Length(RMQ+二分)
- theme.info文件注释
- 1411181709-ny-+-字符串
- 三星SSD企业级,型号PM853T参数及产品特点?
- iphone wifi连接时 ajax 同步请求错误
- 压缩算法-游程算法
- Finding memory Leak (ps –sort pmem)
- 安卓ashmem学习内核解析
- 升级Xcode后的插件无效问题