有没有一段代码,让你觉得人类的智慧璀璨无比?(手动滑稽)

分享几个第一次看到就被它的优美深深震撼到的代码:
1、线性求逆元:

for (int i = 2; i < MAXN; i++)
	inv[i] = mul(inv[mod%i], mod - mod / i, mod);

仅仅两行代码,就实现了在 O ( n ) O(n) 的时间内求出1到n对模m的逆元有木有!?

2、求最大公因数:

int gcd(int x, int y){return y ? gcd(y, x%y) : x;}

第一次接触到这样的代码时,我的内心是这样的:

wtf???黑人问号.jpg

3、树状数组
对于单点修改区间求和,树状数组可谓达到了时空复杂度的极限,甚至不多用额外一字节存储空间。来看看它的实现:
修改:

void add(int i, int x){
	for (;i <= n; i += i & -i)tree[i] += x;
}

查询:

int sum(int i){
	int ret = 0;
	for(; i; i -= i & -i)ret +=tree[i];
	return ret;
}

表示记性不好的我看完一遍也记住了呢。

4、zkw线段树
对于单点修改区间查询的线段树,zkw大神实力教你如何1分钟内码出代码:
修改:

void set(int x, int value){
	val[x += treeLen] = value;
	while (x >>= 1)pushUp(x);
}

查询:

int query(int l,int r){
	int ret = 0;
	for (l += treeLen - 1, r += treeLen +1; l ^ r ^ 1; l >>= 1, r >>= 1){
		if (~l & 1)ret = min(ret, val[l^1]);
		if (r & 1)ret = min(ret, val[r ^ 1]);
	}
	return ret;
}
  • 以上都是一些十分基础但真的让你赞不绝口的算法和数据结构。还有一些稍微复杂一些的栗子,由于手机码代码太不方便了,就以后再更吧。(如果有笔误打错的地方欢迎指正哈)

更多好看好玩有趣的C/C++入门

发布了12 篇原创文章 · 获赞 0 · 访问量 491

猜你喜欢

转载自blog.csdn.net/xiangxin1030/article/details/103938636