排序有个非常好用的stl
sort()基本使用方法
在 C++ 中,sort 函数是 头文件中的一个功能强大的工具,
用于对给定范围内的元素进行排序。
sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp),
其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最
后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,如果不写的话,
默认从小到大进行排序。如果我们想从大到小排序可以将cmp参数写为greater()
就是对int数组进行排序,当然<>中我们也可以写double、long、float等等。
如果我们需要按照其他的排序准则,那么就需要我们自己定义一个bool类型的函数来传入。
自定义排序准则
使用sort()我们不仅仅可以从大到小排或者从小到大排,还可以按照一定的准则进行排序
1.确定分界点
2.调整区间,以分间点左右划分
3.递归处理左右俩段
void quick_sort(int q[],int l,int r)
{
if(l>=r)return;
int x=q[l],i=l-1,j=r+1;
while(ix);
if(i
1.确定分界点 mid=(l+r)/2;
2.递归排序
3.归并--合二为一
const int N=100010;
int tem[N];
viod 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])tem[k++]=q[i++];
else tmp[k+1]=q[j++];
while(i<=mid)tmp[k++]=q[i++];
while(j<=r)tmp[k++]=q[j++];
for(i=1,j=0;i<=r;i++,j++)
q[i]=tmp[j];
}
方式1
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,
其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1
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;
}
方式2
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,
其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
例子求平方根
#include
using namespace std;
int main()
{
double x;
cin>>x;
double l=0,r=x;
while(r-l>1e-8)
{
double mid=(l+r)/2;
if(mid*mid>=x)r=mid;
else l=mid;
}
printf("%lf\n",l);
}
#include
#include
using namespace std;
//c=A+B;
vector add(vector&A,vector&B)
{
vector c;
int t=0;
for(int i=0;iA,B;
cin>>a>>b;//a="123456"
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
//A=[6,5,4,3,2,1]
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;
}
#include
#include
using namespace std;
//判断是否有A>=B
bool cmp(vector&A,vector&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;
}
//C=A-B
vector sub(vector&A,vector&B)
{
vector c;
for(int i=0,t=0;i1&&c.back()==0)c.pop_back();//去掉前导0
return c;
}
int main()
{
string a,b;
vectorA,B;
cin>>a>>b;//a=123456
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');
if(cmp(A,B))
{
auto c=sub(A,B);
for(int i=c.size()-1;i>=0;i--)printf("%d",c[i]);
}
else
{
auto c=sub(B,A);
printf("-");
for(int i=c.size()-1;i>=0;i--)printf("%d",c[i]);
}
return 0;
}
这个支持15位以内的
#include
#include
using namespace std;
vector mul(vector&A,int b>
{
vector c;
int t=0;
for(int i=0;iA;
for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
auto c=mul(A,b);
for(int i=c.size()-1;i>=0;i--)printf("%d",c[i]);
return 0;
}
俩个数都非常大用这个
#include
#include
#include
#include
using namespace std;
char a1[10001],b1[10001];
int a[10001],b[10001],i,x,len,j,c[10001];
int main (){
cin>>a1>>b1;
int lena=strlen(a1);
int lenb=strlen(b1);
for(i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
for(i=1;i<=lenb;i++)b[i]=b1[lenb-i]-'0';
for(i=1;i<=lenb;i++)
for(j=1;j<=lena;j++)
c[i+j-1]+=a[j]*b[i];
for(i=1;i9)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
len=lena+lenb;
while(c[len]==0&&len>1)len--;
for(i=len;i>=1;i--)cout<
#include
#include
#include
using namespace std;
//A/B,商是c,余数是r
vector div(vetor&A,int b,int &r)
{
vectorc;//商
r=0;
for(int i=A.size()-1;i>=0;i--)
{
r=r*10+A[i];
c.push_back(r/k);
r%=b;
}
reverse(c.begin(),c.end());
while(c.size()>1&&c.size()==0)c.pop_back();
return c;
}
int main()
{
string a;
int b;
cin>>a>>b;
vectorA;
for(int a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
int r;
auto c=div(A,b,r);
for(int i=a.size()-1;i>=0;i--)printf("%d",c[i]);
cout<
#include
using namespace std;
const int N=100010;
int n,m;
int a[N],s[N];
int main()
{
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];//前缀和的初始化
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",s[r]-s[l-1]);//区间和的计算
}
return 0;
}
#include
using namespace std;
const int N=10010;
int n,m,q;
int a[N][N],s[N][N];
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",a[i][j]);
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]+a[i][j];//求前缀和
while(q--)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d\n",s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]);
//算子矩阵的和
}
return 0;
}
#include
using namespace std;
const int N=100010;
int n,m;
int a[N],b[N];
void insert(int l,int r,int c)
{
b[l]+=c;
b[r+1]-=c;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",a[i]);
for(int i=1;i<=n;i++)insert(i,i,a[i]);
while(m--)
{
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
insert(l,r,c);
}
for(int i=1;i<=n;i++)b[i]+=b[i-1];
for(int i=1;i<=n;i++)printf("%d",b[i]);
return 0;
}
#include
using namespace std;
const int N=1010;
int n,m,q;
int a[N][N],b[N][N];
void insert(int x1,int y1,int x2,int y2,int c)
{
b[x1][y1]+=c;
b[x2+1][y1]-=c;
b[y1][x2+1]-=c;
b[x2+1][y2+1]+=c;
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
insert(i,j,i,j,a[i][j]);
while(q--)
{
int x1,y1,x2,y2,c;
cin>>x1>>y1>>x2>>y2>>c;
insert(x1,y1,x2,y2,c);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d",b[i][j]);
puts("");
}
return 0;
}
for(i=0,j=0;i
例子:将每个单词输出来由空格隔开
#include
#include
using namespace std;
int main()
{
char str[1000];
gets(str);
int n=strlen(str);
for(int i=0;i
n的二进制表示中第k位是什么
1.先把地k位移动到最后一位n>>k;
2.看个位是几:
n>>k&1;
lowbit(x):
返回x的最后一位1;
例子:
x=1010;
lowbit(x)=10;
x&-x==x&(~x+1);
例子:一个数转成2进制看它有几个一
#include
using namespace std;
int lowbit(int x)
{
return x&-x;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int x;
cin>>x;
int res=0;
while(x)
{
x-=lowbit(x);//每次减去x的最后一位1;
res++;
}cout<