[exaqp]常用模板

感谢名单

Z_LOVE_OI , 精神小伙!

进制输出

oct 是八进制输出,

cout<<oct<<a<<endl;

dec 是十进制(效果和默认一样),

cout<<dec<<a<<endl;

hex 是十六进制输出(字母默认是小写字母)。

cout<<hex<<a<<endl;

快读快写

$ int $

#define gc getchar()
inline int read(){
	int x=0; bool sgn=0; char s=gc;
	while(!isdigit(s))sgn|=s=='-',s=gc;
	while(isdigit(s))x=(x<<1)+(x<<3)+(s-'0'),s=gc;
	return sgn?-x:x;
}
inline void write_n(int X){
    if(X<0) putchar('-'),X=~(X-1);
    int s[20],top=0;
    while(X) s[++top]=X%10,X/=10;
    if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
    puts("");
}

$ long $ $ long $

inline ll read_n(){
    ll X=0; bool flag=1; char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-') flag=0;ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
    if(flag) return X;
    return ~(X-1);
}
inline void write_n(ll X){
    if(X<0) putchar('-'),X=~(X-1);
    ll s[20],top=0;
    while(X) s[++top]=X%10,X/=10;
    if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
    puts("");
}

$ string $

inline string read_s(){
    char c;
    string res;
    while((c=getchar())!=' ') res.push_back(c);
    return res;
}
inline void write_s(string s){
    for(string::iterator it=s.begin(),l=s.end(); it!=l; it++){
        putchar(*it);
    }
    putchar('\n');
}

求最大公因数和最小公倍数

#include<bits/stdc++.h>
using namespace std;
int gcd1(int a,int b){ //辗转相除递归解法 
if(b==0)  return a;
return gcd1(b,a%b); 
} 
int gcd2(int a,int b){ //辗转相除法求解 
while(b!=0){
    int r=a%b;
    a=b;
    b=r;
}
return a;
} 
int lcm(int a,int b){ //最小公倍数 
return a*b/gcd1(a,b);
}

$ gcd $ 核心代码

int gcd(int a,int b)
{return a%b ? b : gcd(b,a%b);}

高精度加法

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
string s1,s2;
int a[500],b[500],c[500];
int main()
{
    cin>>s1>>s2;
    a[0]=s1.size();
    for(int i=1;i<=a[0];++i)
        a[i]=s1[a[0]-i]-'0';
    b[0]=s2.size();
    for(int i=1;i<=b[0];++i)
        b[i]=s2[b[0]-i]-'0'; 
	int n=max(a[0],b[0]);
	for(int i=1;i<=n;++i)
	    c[i]=a[i]+b[i];
	for(int i=1;i<=n;++i)
	{
		if(c[i]>=10)
		{
			c[i]%=10;
			++c[i+1];
		}
	}
	if(c[n+1]>0) n++;
	//while(c[n]==0) n--;
	for(int i=n;i>0;--i)
	    cout<<c[i];
	cout<<endl;
	return 0;
}

高精度减法

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
string s1,s2,s3;
int a[50000],b[50000];
int main()
{
    cin>>s1>>s2;
    if(s1.size()<s2.size()||s1.size()==s2.size()&&s1<s2)
    {
    	s3=s1;
    	s1=s2;
    	s2=s3;
    	cout<<"-";
	}
    a[0]=s1.size();b[0]=s2.size();
    for(int i=1;i<=a[0];++i)
        a[i]=s1[a[0]-i]-'0';
    for(int i=1;i<=b[0];++i)
        b[i]=s2[b[0]-i]-'0';
	int n=max(a[0],b[0]);
	for(int i=1;i<=n;++i)
	{
		if(a[i]<b[i])
		{
		    --a[i+1];
			a[i]+=10;
		}
		a[i]=a[i]-b[i];
	}
	while(a[n]==0&&n>1) n--;
	for(int i=n;i>0;--i)
	    cout<<a[i];
	cout<<endl;
	return 0;
}

质数判断

#include<bits/stdc++.h>
using namespace std;
bool isPrime(int num)
{ //质数判断 
    if(num<2)  return false;
    for(int i=2;i<=sqrt(num);i++)
        if(num%i==0)  return false;
    return true;
} 

埃氏筛

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e9;
bool isPrime[MAX]; 
void eraSieve(int MAX){ //埃式筛 
//计算MAX范围内所有的质数 
memset(isPrime,true,sizeof(isPrime)); 
isPrime[0]=isPrime[1]=false;
for(int i=2;i<=MAX;i++){
    if(isPrime[i]){
        for(int j=2;j*i<=MAX;j++){
            isPrime[j*i]=false;
        }
    }
} 
}

欧拉筛

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e7;
bool isPrime[MAX];
int prime[MAX]; 
void EulerSieve(int MAX){ //欧拉筛 
memset(isPrime,true,sizeof(isPrime)); 
isPrime[0]=isPrime[1]=false;
int cnt=0; //质数个数 
for(int i=2;i<=MAX;i++){
    if(isPrime[i]){
        prime[cnt++]=i;
    }
    for(int j=0;j<cnt&&prime[j]*i<=MAX;j++){
        isPrime[prime[j]*i]=false;
        if(i%prime[j]==0)  break;
    }
} 
}

线性筛

#include<bits/stdc++.h>
using namespace std;
int v[100000010];
int n,cnt=0;
int p[6000010];
void getss(int n)//线性筛
{
	for(int i=2;i<=n;++i)
	{
		if(v[i]==0)
		{
			v[i]=i;
			p[++cnt]=i;
		}
		for(int j=1;j<=cnt;++j)
	        {
				if(p[j]>n/i||p[j]>v[i])break;
				v[i*p[j]]=p[j];
			}
	}
	
}

判断回文

#include<bits/stdc++.h>
using namespace std;
char st[101];
int main()
{
	cin>>st;
	int len=strlen(st)-1,i=0;
	int j=len;
	while(i<=j)
	{
		if(st[i]!=st[j])
		{
			cout<<"no"<<endl;
			return 0;
		}
		    i++;
		    j--;	
	}//是回文就输出yes,否则输出no
	cout<<"yes"<<endl;
	return 0;
}

前缀和

一维

for(int i=1;i<=n;++i)
	{
		scanf("%d",&a[i]);
		s[i]=s[i-1]+a[i];
	}    
	int L,N;
	for(int i=1;i<=m;++i)
	{
		scanf("%d%d",&L,&N);
		printf("%d\n",s[N]-s[L-1]);
	}

二维

void gouzao(int x,int y)
{
    s[x][y]=s[x-1][y]+s[x][y-1]-s[x-1][y-1]+a[x][y];
}
int qiuhe(int x1,int y1,int x2,int y2)
{
    return s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
}

差分

一维

void chafen(int l,int r,int k)
{
    ca[l]+=k;
    ca[r+1]-=k;
}

二维

void chafen(int x1,int y1,int x2,int y2,int k)
{
    ca[x1][y1]+=k;
    ca[x1][y2+1]-=k;
    ca[x2+1][y1]-=k;
    ca[x2+1][y2+1]+=k;
}

迪杰斯特拉模板

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int W[51][51];
int d[51];
int pre[51];
bool b[51];
int n,m;
void print(int i)
{
	if(pre[i]) print(pre[i]);
	printf("%d",i);
}
int main()
{
	int i,j,k,w,minn,oo=0x3f3f3f3f,s=1;
	cin>>n>>m;
	memset(W,127/3,sizeof(W));
	for(k=1;k<=m;++k)
	{
	    cin>>i>>j>>w;
	    W[i][j]=W[j][i]=w;
	}
	for(i=1;i<=n;++i)
	{
		d[i]=oo;
		pre[i]=0;
	}
	for(i=1;i<=n;++i)
	{
		minn=oo,k=0;
		for(j=1;i<=n;++j)
		if(!b[j]&&d[j]<minn)
		{
			minn=d[j];
			k=i;
		}
		b[k]=true;
		for(j=1;j<=n;++j)
		if(d[k]+W[k][j]<d[j])
		{
			d[j]=d[k]+W[k][j];
			pre[j]=k;
		}
	}
	print(n);
	return 0;
}

弗洛伊德模板

#include<iostream>
using namespace std; 
void Floyd(){ //Floyd核心代码 
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
  for(int j=1; j<=n; j++)
    if(e[i][j]>e[i][k]+e[k][j])
      e[i][j]=e[i][k]+e[k][j];
}

全排列问题

#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
int num=0,a[10005]={0},n,r;
bool b[10005]={0};
int print()
{
	num++;
	for(int i=1;i<=r;++i)
	    cout<<setw(3)<<a[i];
	cout<<endl;
}
int search(int k)
{
	int i;
	for(int i=1;i<=n;++i)
	    if(!b[i])
	    {
	    	a[k]=i;
	    	b[i]=1;
	    	if(k==r) print();
	    	else     search(k+1);
	    	b[i]=0;
	    }
}
int main()
{
	cout<<"input n,r:";
	cin>>n>>r;
	search(1);
	cout<<"number="<<num<<endl;
} 

走迷宫

#include<cstdio>
#include<iostream>
using namespace std;
char Map[9][9];//地图 
int n,m;//迷宫行列数 
int startx,starty;//入口坐标 
int endx,endy;//出口坐标 
int pathx[81],pathy[81];//保存路径 
bool visit[9][9];//走过标记 
int dx[4]={-1,0,1,0},//x坐标增量 
    dy[4]={0,1,0,-1};//y坐标增量
void print(int step)
{
	for(int i=1;i<=step;++i)
	    printf("%d,%d ",pathx[i],pathy[i]);
	printf("\n");
}
void dfs(int x,int y,int step)
{
	printf("%d,%d step=%d\n",x,y,step);
	pathx[step]=x;
	pathy[step]=y;//保存路径 
	visit[x][y]=true;//保存走过 
	if(x==endx&&y==endy)
	    print(step);//输出路径 
	for(int i=1;i<=4;++i)
	{
		int tx=x+dx[i];
	    int ty=y+dy[i];	
	    if(tx>=1&&tx<=n&&ty>=1&&ty<=m
		&&Map[tx][ty]=='.'&&!visit[tx][ty])
		{
			dfs(tx,ty,step+1);//搜索下一步 
			visit[tx][ty]=false;//回溯一步
		}
	}
}
int main()
{
	cin>>n>>m;
	cin>>startx>>starty>>endx>>endy;
	for(int i=1;i<=n;++i)
	    for(int j=1;j<=m;++j)   
	        cin>>Map[i][j];
	dfs(startx,starty,1);
	return 0;
} 
posted @ 2022-02-14 10:51  exaqp  阅读(62)  评论(0编辑  收藏  举报