51nod加农炮

这道题维护一下前缀最大值然后二分答案就好了哇 233 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=50007,inf=2000007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
    while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
    return ans*f;
}
int n,m,mx,k,l,r;
int a[M],sum[M];
int main()
{
    n=read(); m=read(); 
    for(int i=1;i<=n;i++) a[i]=read(),mx=max(mx,a[i]),sum[i]=max(sum[i-1],a[i]);
    //for(int i=1;i<=n;i++) printf("%d ",sum[i]);
    for(int i=1;i<=m;i++){
        k=read(); if(k>mx||k<=a[1]) continue;
        l=1,r=m;
        while(l<=r){
            int mid=(l+r)>>1;
            if(sum[mid]<k) l=mid+1;
            else r=mid-1;
        }
        //printf("[%d]
",l);
        a[l-1]++; sum[l-1]=max(a[l-1],sum[l-1]);
    }
    for(int i=1;i<=n;i++) printf("%d
",a[i]);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/lyzuikeai/p/7054036.html