80 pts 求调。
查看原帖
80 pts 求调。
1296826
lcfollower楼主2024/9/7 13:49
# include <bits/stdc++.h>

# define int long long
# define rint register int

using namespace std;

const int N = 1e5 + 10;
int n ,w, c1 ,c2 ,a[N];
int b[N];

inline void solve(){
  scanf("%lld %lld" ,&n ,&w);
  int mn = 1e18;
 int sum = 0;
  for(rint i = 1;i <= n;i ++) scanf("%lld" ,a + i) ,mn = min(mn ,a[i]);
  c1 = c2 = 1;
  if((c1 + c2) == 0){
  	puts("0 0");
  	return ;
  } sort(a + 1 ,a + 1 + n);
  int pos = -1;
  for(rint i = 1 ;i <= n;i ++){
  	if(a[i] >= w){
  	  pos = i - 1 ; break ;	
	}
  } if(pos == -1) pos = n;
  sort(a + 1 ,a + 1 + pos ,greater <int> ());
  int mx = 0 ,ans1 = 0 ,temperature = w;
  for(rint i = 1 ;i <= pos;i ++){
    ans1 += abs(temperature - a[i]) ,
	temperature = (abs(a[i + 1] - w) < abs(a[i + 1] - a[i])) ? w : a[i];	
  } for(rint i = pos + 1 ;i <= n;i ++){
    ans1 += abs(temperature - a[i]) ,
	temperature = (abs(a[i + 1] - w) < abs(a[i + 1] - a[i])) ? w : a[i];	
  } printf("%lld " ,ans1 * c1);
  int ans2 = 0;
  sort(a + 1, a + 1 + n);
  int l = 1 ,r = n ,cnt = 0 ,mid = (n + 1) / 2;
  while(l <= mid && r > mid){
  	b[++ cnt] = a[l] ,b[++ cnt] = a[r];
  	++ l ,-- r;
  } if(!(l ^ r)) b[++ cnt] = a[r];
//  for(rint i = 1 ;i <= n;i ++) cout << b[i] << ' ';
  temperature = w;
  for(rint i = 1 ;i <= n;i ++){
    ans2 += abs(temperature - b[i]) ,
	temperature = (abs(b[i + 1] - w) > abs(b[i + 1] - b[i])) ? w : b[i];	
  } for(rint i = 1 ;i <= n / 2;i ++) swap(b[i] ,b[n - i + 1]);
  mx = ans2;
  temperature = w ,ans2 = 0;
  for(rint i = 1 ;i <= n;i ++){
    ans2 += abs(temperature - b[i]) ,
	temperature = (abs(b[i + 1] - w) > abs(b[i + 1] - b[i])) ? w : b[i];	
  } printf("%lld\n" ,max(mx ,ans2) * c2);
} inline void fre(){
  freopen("temperature.in" ,"r" ,stdin);
  freopen("temperature.out" ,"w" ,stdout);
}signed main(){
//  fre();
  int T = 1;
  while(T --) solve();
  return 0;
} 
2024/9/7 13:49
加载中...