1.upper_bound
该函数是C++标准库中的一个算法,用于在给定范围内查找第一个大于指定值的元素的位置。
示例
upper_bound(jobs.begin(),jobs.begin()+i,array<int,3>{jobs[i][1],INT_MAX})-jobs.begin();
第三个参数用于找出第一个大于该元素的数
2.lower_bound
返回容器中第一个不小于给定值的位置
示例
lower_bound(a.begin(),a.begin()+i,l,[](tuple& t, int val){return t.r<val; })-a.begin();
3.ranges
C++20中引入的std::ranges
库的用法,结合了范围(range)操作和排序(sort)
4.{}
初始化
(也称为统一初始化或列表初始化)是一种非常灵活的初始化方式,它被广泛应用于数组、结构体、类以及标准库容器等的初始化
有时候代码明明感觉正确,但是总是运行错误,以下是我遇到的一些情况
(1)在遇到需要回溯的情况时,因为特殊情况之间返回导致没有回溯
(2)在一大串代码中使用了重复的变量名
(3)回溯时没有将状态重置
(4)运算符优先级问题
for (int j = (1 << 10) - 1; j >= 0; j--) {// ...
}
此处的1<<10如果不加括号算出的是511,加括号算出的是1023,天差地别
5.找出一个数的质因数
auto cal=[&](int x)
{vector<int> recond; int ret=1;for(int i=2;i*i<=x;i++){while(x%i==0){recond.push_back(i);x/=i;}}if(x>1)recond.push_back(x);return recond;
};
找出不重复的质因数的个数,初始化
const int mx=1e5+10;for(int i=2;i<mx;i++)
{if(prime[i]==0){for(int j=i;j<mx;j+=i){prime[j]++;}}}
6.快速幂
long long pow(int x,int n)
{long long ret=1;while(n){if(n%2==1)ret*=x;x=x*x;n/=2;}return ret;
}
6.阶乘为k个0的数的个数
力扣-阶乘函数后 K 个零
由于需要有一个0,就需要乘一个10,也就是一个2,一个5,又因为每两个数就会有一个数有一个2的因数,每五个数就会有一个5的因数,所以2的因数>五的因数,只需计算n!中有多少个5的因数就可计算阶乘后有多少个0
得到以下规律(来自灵神评论区的总结)
int cal(int x)
{int ans=0;while(x){x/=5;ans+=x; }return ans;}
上述代码即可计算有x的阶乘有多少个0
7.二分溢出问题
有时二分的边界范围很大
ll left=1,right=1e18;while(left<=right){ll mid=left+(right-left>>1);if(check(mid)>=n)right=mid-1;else left=mid+1;}
如果把上述改成(right-left)>>1则会溢出,目前也不知道是为什么,(>>优先级比-小)
8.回溯问题
有时候知道要回溯,感觉也正确回溯了,但是没有得到正确的答案,可以检查是否存在遇到特殊情况直接返回导致没有回溯
vis[i]=1;
if(dfs(index+1))return 1;
vis[i]=0;
上述就是没有正确的回溯
应该这样
vis[i]=1;
if(dfs(index+1))
{vis[i]=0;return 1;
}
vis[i]=0;
9.欧拉函数
若n和m的质因数种类相同,m是n的k倍那么
10.整形溢出问题
记得开long long