BZOJ4590: [Shoi2015]自动刷题机

来源:互联网 发布:淘宝nike专卖店 编辑:程序博客网 时间:2024/06/09 21:37

BZOJ4590

sb二分题
我CTM-1打成-2!!?
判无解的时候都要check一下。。不能=0就出-1.

【代码】

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#define N 100005#define Mod 1000000007#define INF 0x7fffffffusing namespace std;typedef long long ll;typedef unsigned long long ull;const ull base=31;ll read(){    ll x=0,f=1;char ch=getchar();    while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}    return x*f;}int n,m;int a[N]; ll L,R,Mx,Amn,Amx;int Check(ll mid){    ll now=0;int sum=0;    for(int i=1;i<=n;i++)    {        now+=a[i];now=max(now,1LL*0);        if(now>=mid) sum++,now=0;    }    return sum;} int main(){    n=read();m=read();    for(int i=1;i<=n;i++) a[i]=read(),R+=(a[i]>0)?a[i]:0;    Mx=R;L=1;    while(L<=R)    {        ll mid=L+R>>1;        if(Check(mid)>=m) Amx=mid,L=mid+1;        else R=mid-1;    }    R=Mx,L=1;    while(L<=R)    {        ll mid=L+R>>1;        if(Check(mid)<=m) Amn=mid,R=mid-1;        else L=mid+1;    }    if(Check(Amn)!=m||Check(Amx)!=m) printf("-1\n");    else printf("%lld %lld\n",Amn,Amx);    return 0;}
原创粉丝点击