HDU 3486 Interviewe

来源:互联网 发布:软件开发工作 翻译 编辑:程序博客网 时间:2024/06/15 06:16
/*题意:求k个区间的最大值之和。区间长度是n/k;思路:rmq+二分 */#include<stdio.h>#include<string.h>#include<algorithm>#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>#include<iostream>#include<stdlib.h>#include<set>#include<map>#include<queue>#include<stack>#include<vector>#include<bitset>#pragma comment(linker, "/STACK:1024000000,1024000000")template <class T>bool scanff(T &ret){    char c; int sgn; T bit=0.1;    if(c=getchar(),c==EOF) return 0;    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();    sgn=(c=='-')?-1:1;    ret=(c=='-')?0:(c-'0');    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');    if(c==' '||c=='\n'){ ret*=sgn; return 1; }    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;    ret*=sgn;    return 1;}#define inf 1073741824#define llinf 4611686018285162540LL#define eps 1e-8#define mod 9223372034707292160LL#define pi acos(-1.0)#define lth (th<<1)#define rth (th<<1|1)#define rep(i,a,b) for(int i=a;i<=b;i++)#define drep(i,a,b) for(int i=a;i>=b;i--)#define mset(x,val) memset(x,val,sizeof(x))#define mcpy(x,y) memcpy(x,y,sizeof(y))#define findx(x) lower_bound(b+1,b+1+bn,x)-b#define mpii(a,b) make_pair(a,b);#define NN 101010#define MM 202020using namespace std;typedef long long ll;typedef long double lb;typedef pair<int,int> pii;int n,m,ma[MM][26],a[MM];void init(){    int len=(int)(log(double(n))/log(2.0));    rep(i,1,n) ma[i][0]=a[i];    rep(j,1,len)    rep(i,1,n) if(i+(1<<(j-1))<=n) ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);}int rmq(int l,int r){    int len=(int)(log(double(r-l+1))/log(2.0));    return max(ma[l][len],ma[r-(1<<len)+1][len]);}int getsum(int k){    int len=n/k,ans=0;    rep(i,1,k) ans+=rmq(len*(i-1)+1,len*i);    return ans;}int main(){    while(scanf("%d%d",&n,&m)!=EOF){        if(n<0&&m<0) break;        int sum=0,mm=0;        rep(i,1,n){            scanf("%d",&a[i]);            sum+=a[i];            mm=max(a[i],mm);        }        if(mm>=m) {printf("1\n");continue;}        if(sum<m) {printf("-1\n");continue;}        init();        int l,r,ans;        l=1,r=n;        while(r>=l){            int mid=(l+r)>>1;            int pd=getsum(mid);            if(pd>m){                ans=mid;                r=mid-1;            }            else l=mid+1;        }        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击