#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int n,k;
int BinarySearch1(int x)
{
int l = 0,r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(a[mid] < x){
l = mid + 1;
}else{
r = mid;
}
}
return l;
}
int BinarySearch2(int x)
{
int l = 0,r = n - 1;
while(l < r){
int mid = l + r + 1 >> 1;
if(a[mid] > x){
r = mid - 1;
}else{
l = mid;
}
}
return l;
}
int main()
{
cin >> n >> k;
for(int i = 0;i < n;i ++) cin >> a[i];
if(k < a[0]){
cout << "-1 0" << endl;
}else if(k > a[n - 1]){
cout << n - 1 << ' ' << n << endl;
}else{
int l1 = BinarySearch1(k);
int l2 = BinarySearch2(k);
cout << l2 << ' ' << l1 << endl;
}
return 0;
}
7-32
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int n,k;
typedef long long LL;
int main()
{
cin >> n;
for(int i = 0,x;i < n;i ++)
cin >> x >> a[i];
sort(a,a+n);
int mid = a[n >> 1];
LL sum = 0;
for(int i = 0;i < n;i ++){
sum += fabs(a[i] - mid);
}
cout << sum << endl;
return 0;
}
/*
1,3,8
4-1+4-3+8-4
*/
7-33
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int n,k;
int BinarySearch1(int x)
{
int l = 0,r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(a[mid] < x){
l = mid + 1;
}else{
r = mid;
}
}
return l;
}
int BinarySearch2(int x)
{
int l = 0,r = n - 1;
while(l < r){
int mid = l + r + 1 >> 1;
if(a[mid] > x){
r = mid - 1;
}else{
l = mid;
}
}
return l;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n >> k;
for(int i = 0;i < n;i ++) cin >> a[i];
if(k < a[0]){
cout << a[0] << endl;
}else if(k > a[n - 1]){
cout << a[n - 1] << endl;
}else{
int l1 = BinarySearch1(k);
int l2 = BinarySearch2(k);
int f1 = k - a[l2],f2 = a[l1] - k;
if(f1 <= f2){
cout << a[l2] << endl;
}else{
cout << a[l1] << endl;
}
}
return 0;
}
7-34
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 30;
int l[N], r[N], v[N], h[N], idx;
void update(int u)
{
h[u] = max(h[l[u]], h[r[u]]) + 1;
}
void R(int& u)
{
int p = l[u];
l[u] = r[p], r[p] = u;
update(u), update(p);
u = p;
}
void L(int& u)
{
int p = r[u];
r[u] = l[p], l[p] = u;
update(u), update(p);
u = p;
}
int get_balance(int u)
{
return h[l[u]] - h[r[u]];
}
void insert(int& u, int w)
{
if (!u) u = ++ idx, v[u] = w;
else if (w < v[u])
{
insert(l[u], w);
if (get_balance(u) == 2)
{
if (get_balance(l[u]) == 1) R(u);
else L(l[u]), R(u);
}
}
else
{
insert(r[u], w);
if (get_balance(u) == -2)
{
if (get_balance(r[u]) == -1) L(u);
else R(r[u]), L(u);
}
}
update(u);
}
int main()
{
int n, root = 0;
cin >> n;
while (n -- )
{
int w;
cin >> w;
insert(root, w);
}
cout << v[root] << endl;
return 0;
}
7-35
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
void PrintHeap(vector<int>& Minimum_heap);
int main()
{
int n, k, m;
scanf("%d%d", &n, &k);//n是堆的容量,需创建一个容量为n的堆。
//接下来k行,是对这个堆的依次的k项插入或删除操作:用 1 x 表示插入元素x;
//用 -1 表示删除堆顶。
vector<int> minHeap_1, minHeap_2;
make_heap(minHeap_1.begin(), minHeap_1.end(), greater<int>());
int operate_number, insert_number, i;
for(i = 0; i < k; i++)
{
scanf("%d", &operate_number);
if(operate_number == 1)
{
scanf("%d", &insert_number);
if((int)minHeap_1.size() < n)//堆满则不能插入元素
{
minHeap_1.push_back(insert_number);
push_heap(minHeap_1.begin(), minHeap_1.end(), greater<int>());
}
PrintHeap(minHeap_1);
}
else if(operate_number == -1)
{
if(!minHeap_1.empty())//堆空不可删除
{
pop_heap(minHeap_1.begin(), minHeap_1.end(), greater<int>());
minHeap_1.pop_back();
}
PrintHeap(minHeap_1);
}
}
scanf("%d", &m);
for(int i = 0; i < m; i++)
{
scanf("%d", &insert_number);
minHeap_2.push_back(insert_number);
}
make_heap(minHeap_2.begin(), minHeap_2.end(), greater<int>());
//这一步尤其关键,执行了这一句后会对vector中所有的元素做调整,使之
//成为一个最小堆
PrintHeap(minHeap_2);
return 0;
}
void PrintHeap(vector<int>& Minimum_heap)
{
int heap_size = Minimum_heap.size();
vector<int>::iterator ptr = Minimum_heap.begin();
for (int i = 1; i < heap_size; i++, ptr++)
{
printf("%d ", *ptr);
}
printf("%d\n", *ptr);
}
7-36
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int l[N],r[N],e[N],idx;
int h[N];
int n;
void update(int u)
{
h[u] = max(h[l[u]],h[r[u]]) + 1;
}
int get_balance(int u)
{
return h[l[u]] - h[r[u]];
}
void R(int &u)
{
int p = l[u];
l[u] = r[p];
r[p] = u;
update(u),update(p);
u = p;
}
void L(int &u)
{
int p = r[u];
r[u] = l[p];
l[p] = u;
update(u),update(p);//更新高度。
u = p;
}
void insert(int &u,int val)
{
if(u == -1) e[idx] = val,u = idx ++;
else if(val < e[u]){
insert(l[u],val);
if(get_balance(u) == 2){
if(get_balance(l[u]) == 1) R(u);
else L(l[u]),R(u);
}
}else{
insert(r[u],val);
if(get_balance(u) == -2){
if(get_balance(r[u]) != -1) R(r[u]);
L(u);
}
}
update(u);
}
int main()
{
memset(l,-1,sizeof(l));
memset(r,-1,sizeof(r));
int root = -1;
cin >> n;
int a;
while(n --){
cin >> a;
insert(root,a);
}
cout << e[root] << endl;
return 0;
}