杂项

绝对值函数abs

包含头文件 <cmath> 或 <cstdlib> 或 <std/c++.h>

库函数定义
int abs( int num );
float abs( float num );
double abs( double num );
long double abs( long double num );
long long abs( long long num );
总之:abs函数可用于int,float,double,long double,long long

lower_bound()与upper_bound()

用二分查找,在一个有序的序列中,查找大于等于(大于)\(x\)的数
注意:序列必须有序,否则需要先\(sort\)排序一下
时间复杂度:\(O(log(n))\)
用法一:
在升序序列中查找第一个大于等于(大于)x的数,如果找不到,则返回数组最后一个元素的下一个

int a[10] = {0, 1, 4, 3, 7, 2}; 

sort(a+1, a+1+5);
//在a[1~5]之间查找第一个大于等于x的数
//如果没有则返回a[5]的下一个位置
lower_bound(a+1, a+1+5, x);	
//在a[1~5]之间查找第一个大于x的数
upper_bound(a+1, a+1+5, x);	

用法二:
在降序序列中查找第一个小于等于(小于)x的数,如果找不到,则返回数组最后一个元素的下一个

int a[10] = {0, 1, 4, 3, 7, 2}; 

sort(a+1, a+1+5, greater<int>());
//在a[1~5]之间查找第一个小于等于x的数
//如果没有则返回a[5]的下一个位置
lower_bound(a+1, a+1+5, x, greater<int>()); 
//在a[1~5]之间查找第一个小于x的数
upper_bound(a+1, a+1+5, x, greater<int>());	

__int128介绍

简介

当题目中数值范围超过long long(最大约9e18时),常规整型会发生溢出,导致结果错误。
而__int128是GCC编译器支持的128位整型,能存储范围为\(-2^{127} 到 2^{127}-1\)(约-1e38 ~ 1e38),可作为高精度算法的“轻量化替代方案”,无需复杂的高精度模板就能处理超大规模整数运算。

核心特性

存储范围:
signed __int128:支持-1e38 ~ 1e38(约39位十进制数)
unsigned __int128:支持0 ~ 2e38(无符号,范围更大)
运算支持: 支持+、-、*、/、% 等所有常规算术运算,用法与long long完全一致
效率优势:底层由编译器优化,运算速度远超手写高精度算法
使用场景:数值范围略超long long,但无需高精度算法的场景

输出

__int128不能直接用printf或cout输出,需要自定义输出函数

void p(__int128 x)
{
	if(x > 9) p(x / 10); 
	putchar(x % 10 + '0');
}
posted @ 2024-01-05 16:28  毛竹259  阅读(146)  评论(0)    收藏  举报