欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 刷题笔记,语法,理解

刷题笔记,语法,理解

2025/4/15 1:40:09 来源:https://blog.csdn.net/m0_72628591/article/details/145793544  浏览:    关键词:刷题笔记,语法,理解

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倍那么\varphi (m)=k*\varphi (n)

10.整形溢出问题

记得开long long

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词