hdu 3486 Interviewe 【RMQ】

本文深入分析了不满足单调性情况下,二分解法的应用局限性及可能的解决策略,通过实例代码展示了一种解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不满足单调性,所以二分解法不正确(虽然可以过OJ),

#include<cstdio> #include<iostream> using namespace std; const int maxn=200000+10; int dp[maxn][20],mylog[maxn],n; long long k; void read(int &d) { char ch; while(ch=getchar(),ch<48||ch>57); d=ch-48; while(ch=getchar(),ch<58&&ch>47) d=d*10+ch-48; } void init(int n) { int i,j,&lev=mylog[n]; for(j=1;j<=lev+1;j++) for(i=0;i+(1<<j)<=n;i++) dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]); } int query(int l,int r) { int &lev=mylog[r-l+1]; return max(dp[l-1][lev],dp[r-(1<<lev)][lev]); } int main() { for(int i=0;i<18;i++) for(int j=1<<i;j<(1<<i+1)&&j<maxn;j++) mylog[j]=i; while(cin>>n>>k) { if(n<0&&k<0) return 0; for(int i=0;i<n;i++) read(dp[i][0]); init(n); long long ans=0; int i,j,l,r,tmp,eve, m, per = -1, ps; for(i = 1; i <= n; i++) { eve = n / i; m = eve * i; //per==eve?j=ps+1:ans=0,j=1; if(per == eve) j=ps+1; else ans=0,j=1; for(; j + eve - 1 <= m; j += eve) { l = j; r = j + eve - 1; tmp = query(l, r); ans += tmp; if(ans > k) break; } if(ans > k) break; per = eve; ps = m; } cout<<(ans>k?i:-1)<<endl; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值