hdu 3486 Interviewe 【RMQ】

来源:互联网 发布:oppo结构工程师pe 知乎 编辑:程序博客网 时间:2024/05/22 06:41

不满足单调性,所以二分解法不正确(虽然可以过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;             }}