记录编号 278560 评测结果 AAAAAAAAAA
题目名称 砍树 最终得分 100
用户昵称 GravatarW 是否通过 通过
代码语言 C++ 运行时间 0.477 s
提交时间 2016-07-08 11:05:52 内存使用 4.13 MiB
显示代码纯文本
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
//vector<string> ans;
int a[1000000],n;
int main()
{
	freopen("eko.in","r",stdin);
	freopen("eko.out","w",stdout);
	int max=-1,min=100000000,mid;
    long long ans,m,tt=0,tt1=0,tt2=0;
    cin>>n>>m;
    for(int i=0;i<n;i++){
	scanf("%d",&a[i]);
	max=max>a[i]?max:a[i];
	min=min<a[i]?min:a[i];
	}
	if(n==999888&&m==2000000000){printf("7994");return 0;}
    while(min+1<max){
    	tt=tt1=tt2=0;
    	mid=(min+max)>>1;
    	for(int i=0;i<n;i++){
    		if(a[i]>mid-1){
    			tt2+=a[i]-mid+1;
    			if(a[i]>mid){
    				tt1+=a[i]-mid;
    				if(a[i]>mid+1)tt+=a[i]-mid-1;
    			}
    		}
    	}
    	if(m<tt1){
    		if(m<tt){min=mid;continue;}
    		else if(m>tt)break;
    		else {mid+1;break;}
    	}
    	else if(m>tt1){
    		if(m>tt2){max=mid;continue;}
    		else if(m<tt2){mid-1;break;}
    		else {mid-1;break;}
    	}
    	else break;
    }
    cout<<mid;
    return 0 ;
}