NOIP前 基础算法模板

/*
	created by scarlyw
	基础算法模板 
*/
#include <bits/stdc++.h>

const int MAXN = 100000 + 10;
//排序
namespace sort {
inline void int_sort() {
	static int n;
	static int a[MAXN]; 
	std::cin >> n;
	for (int i = 1; i <= n; ++i) std::cin >> a[i];
	std::sort(a + 1, a + n + 1);	
}

struct data {
	int x, y, z;
	inline bool operator < (const data &a) const {
		return (x == a.x) ? ((y == a.y) ? (z < a.z) : (y < a.y)) : (x < a.x);
		//x第一关键字,y第二关键字,z第三关键字 
	}
} ; 
//多关键字排序 
inline void struct_sort () {
	static int n;
	static data a[MAXN];
	std::cin >> n;
	for (int i = 1; i <= n; ++i) std::cin >> a[i].x >> a[i].y >> a[i].z;
	std::sort(a + 1, a + n + 1);
}
}
 
//逆序对
namespace inverse_pair() {

//归并排序求逆序对 (ans为答案) 
inline void merge_sort(int l, int r) {
	if (l == r) return ;
	static int b[MAXN];
	int mid = l + r >> 1;
	merge_sort(l, mid), merge_sort(mid + 1, r);
	int i = l, j = mid + 1, cur = l;
	while (i <= mid && j <= r) {
		if (a[j] < a[i]) ans += mid - i + 1, b[cur++] = a[j++];
		else b[cur++] = a[i++];
	}
	while (i <= mid) b[cur++] = a[i++];
	while (j <= r) b[cur++] = a[j++];
	for (int i = l; i <= r; ++i) a[i] = b[i];
}

//树状数组求逆序对 (solve()返回逆序对数) 
struct binary_indexed_tree {
	const int MAXX = 100000;
	int bit[MAXN];
	inline int lowbit(int i) {
		return i & -i;
	}
	
	inline void add(int i) {
		for (; i <= MAXX; i += lowbit(i)) bit[i]++;
	}
	
	inline int query(int i) {
		int ans = 0;
		for (; i; i -= lowbit(i)) ans += bit[i];
		return ans;
	}
	
	inline long long solve() {
		std::cin >> n;
		long long ans = 0;
		for (int i = 1; i <= n; ++i) std::cin >> a[i];
		for (int i = 1; i <= n; ++i)
			ans += (i - 1 - query(a[i])), add(a[i]);
		return ans;
	}
} bit;
}

//中位数
namespace middle_number {

//直接nth_element实现,return为中位数 
inline int get_middle_number() {
	static int n;
	static int a[MAXN];
	std::cin >> n;
	for (int i = 1; i <= n; ++i) std::cin >> a[i];
	if (n & 1) {
		std::nth_element(a + 1, a + n / 2 + 1, a + n + 1);
		return a[n / 2 + 1];
	} else {
		double x;
		std::nth_element(a + 1, a + n / 2, a + n + 1), x = a[n / 2];
		std::nth_element(a + 1, a + n / 2 + 1, a + n + 1), x += a[n / 2 + 1];
		x /= 2;
		return x;
	}
}
}

//离散化 
namespace s_apart {

//num存储原来的大小,ori是原数组编号 
struct data {
	int num, ori;
	inline bool operator < (const data &a) const {
		return num < a.num;
	}
} b[MAXN];

//a数组中是离散化后的 
inline void apart(data *b, int *a, int n) {
	std::sort(b + 1, b + n + 1);
	int i = 1;
	while (i <= n) {
		int j = i;
		while (b[i + 1].num == b[i].num) {
			if (i == n) break ;
			++i;
		}
		++top;
		for (int k = j; k <= i; ++k) a[b[k].ori] = top;
		++i;
	}
}
}

//二分 & 三分 
namespace cut {
//二分
inline int binary() {
	int l = 0, r = n + 1;
	while (l + 1 < r) {
		int mid = l + r >> 1;
		if (check(mid)) l = mid;
		else r = mid;
	}
	return l;
}

//三分 
inline double trisection() {
	double l = 0, r = n + 1;
	while (l + eps < r) {
		double mid1 = l + (r - l) / 3, mid2 = r - (r - l) / 3;
		if (better(calc(mid1), calc(mid2))) r = mid2;
		else l = mid1;
	}
	return better(calc(l), calc(r)) ? l : r;
}
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值