一.快速排序
void quick_sort(int q[],int l,int r) {
if (l >= r) return;
int X = q[l], i = l - 1, j = r + 1;
while (i < j) {
do i++; while (q[i] <= X);
do j--; while (q[j] >= X);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
二.归并排序
void merge_sort(int q[],int l,int r)
{
if(l>=r) return ;
int mid=l+r>>1;
merge_sort(q,l,mid);merge_sort(q,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
if(q[i]<=q[j]) tmp[k++]=q[i];
else tmp[k++]=q[j];
while(i<=mid) tmp[k++]=q[i++];
while(j<=r) tmp[k++]=q[j++];
for(int i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];
}
三.整数二分
int bsearch_1(int l,int r)
{
while(l<r)
{
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
return l;
}
四.高精度a+b
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<int> add(vector<int> &a,vector<int > &b)
{
vector<int>c;
int t=0;
for(int i=0;i<a.size()||i<b.size();i++)
{
if(i<a.size()) t+=a[i];
if(i<b.size()) t+=b[i];
c.push_back(t%10);
t/=10;
}
if(t) c.push_back(1);
return c;
}
int main()
{
string a,b;
vector<int>A,B;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
auto c=add(A,B);
for(int i=c.size()-1;i>=0;i--) printf("%d",c[i]);
return 0;
}
五.高精度a-b
bool compare(vector<int> &a,vector <int >&b)
{
if(a.size()!=b.size()) return a.size()>b.size();
for(int i=a.size()-1;i>=0;i--)
{
if(a[i]!=b[i]) return a[i]>b[i];
}
return true;
}
vector<int> add(vector<int> &a,vector<int > &b)
{
int t=0;
vector<int> c;
for(int i=0;i<a.size();i++)
{
t=a[i]-t;
if(i<=b.size()) t-=b[i];
c.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
六.高精度a*b
vector<int> add(vector<int> &a,int b)
{
int t=0;
vector<int> c;
for(int i=0;i<a.size()||t!=0;i++)
{
if(i<a.size()) t+=a[i]*b;
c.push_back(t%10);
t=t/10;
}
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
七.高精度a/b
vector<int> add(vector<int> &a,int b,int &r)
{
int t=0;
vector<int> c;
for(int i=0;i<a.size()||t!=0;i++)
{
c.push_back(r/b);
r%=b;
}
reverse(c.begin(),c.end());
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
八.前缀和
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n; i ++ ) s[i] = s[i - 1] + a[i]; // 前缀和的初始化
九. 子矩阵的和
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
十.双指针算法
eg.1 #include<bits/stdc++.h>
using namespace std;
int main ()
{
string str;
getline(cin,str);
int n=str.size();
for(int i=0;i<n;i++)
{
int j=i;
while (j<n&&str[j]!=' ') j++;
for(int k=i;k<j;k++) cout<<str[k];
cout<<endl;
i=j;
}
return 0;
}
eg.2
for (int i = 0, j = 0; i < n; i ++ )
{
s[q[i]] ++ ;
while (j < i && s[q[i]] > 1)
{
s[q[j]]--;
j++;
}
res = max(res, i - j + 1);
}
十一.位运算
while (n -- )
{
int x, s = 0;
scanf("%d", &x);
for (int i = x; i; i -= i & -i) s ++ ;
printf("%d ", s);
}
while(n--)
{
int x;
cin>>x;
int res=0;
while(x) x-=low(x),res++;
}