#include<iostream> #include<algorithm> usingnamespacestd; constint N = 100010; int a[N],n;
voiddown(int a[],int u,int len){ int t = u; if (2*u <= len && a[2*u] > a[t]) t = 2*u; if (2*u+1 <= len && a[2*u+1] > a[t]) t = 2*u+1; if (t != u){ swap(a[u],a[t]); down(a,t,len); } }
intheap_sort(int a[],int n){ int len = n; // len维护堆的大小,范围:1~len int k = n % 2 ? n/2 + 1 : n/2; for (int i = n/2; i; i --) down(a,i,len); // 建堆 int res = 0; for (int i = 0;i < k;i ++){ // k轮,每一轮操作找到最大的一个数 // 注意顺序不要写反,先把堆顶换下来,然后删掉末尾,down堆顶 res += a[1]; swap(a[1],a[len]); len --; down(a,1,len); } return res; }
intmain(){ cin >> n; int sum = 0; for (int i = 1;i <= n;i ++){ cin >> a[i]; // 注意下标从1开始 sum += a[i]; } int max_sum = heap_sort(a,n); cout << (n % 2 ? 1 : 0) << ' ' << 2*max_sum - sum << '\n'; return0; }
#include<iostream> #include<algorithm> usingnamespacestd; typedeflonglong LL; constint N = 1e5+5; int a[N],b[N],c[N]; int l,m,n;
intmain(){ cin >> l >> m >> n; for (int i = 0;i < l;i ++) cin >> a[i]; for (int i = 0;i < m;i ++) cin >> b[i]; for (int i = 0;i < n;i ++) cin >> c[i]; LL res = 1e12; // 三指针扫描,res取一个很大的数 for (int i = 0,j = 0,k = 0;i < l && j < m && k < n;){ int x = a[i],y = b[j],z = c[k]; res = min(res,2*((LL)max(max(x,y),z) - min(min(x,y),z))); if (x <= y && x <= z) i ++; if (y <= x && y <= z) j ++; if (z <= x && z <= y) k ++; } cout << res << '\n'; return0; }