记录编号 |
278560 |
评测结果 |
AAAAAAAAAA |
题目名称 |
砍树 |
最终得分 |
100 |
用户昵称 |
W |
是否通过 |
通过 |
代码语言 |
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 ;
}