C++竞赛常用实用代码

欢迎各位读者发评论补充(我会标明补充者的博客和链接)

目录

头文件

读入优化

输出优化

方向数组

坐标结构体

邻接表

优先队列仿函数模板

普通快速幂

递归快速幂

并查集

构造

查找

合并

树状数组

准备&构造&维护

前缀和

指定年月算天数


下一页:C++竞赛常用实用代码(2)

头文件

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<map>
#include<ctime>
#include<climits>
#include<complex>
#define ll long long
#define MAXN 100005
#define INFint 0x3f3f3f3f
#define INFll 0x7f7f7f7f
#define uns unsigned
using namespace std;

或者用万能头:

#include<bits/stdc++.h>
#define ll long long
#define MAXN 100005
#define INFint 0x3f3f3f3f
#define INFll 0x7f7f7f7f
#define uns unsigned
using namespace std;

读入优化

inline int read(){
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f*=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return f*x;
}
//怎么用:
n=read();

功能强大的改进版(常数更小,读long long,且遇到文件末尾返回0):

#define ll long long
inline ll read(){
	ll x=0;bool f=1;char s=getchar();
	while((s<'0'||s>'9')&&s>0){if(s=='-')f^=1;s=getchar();}
	while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+s-'0',s=getchar();
	return f?x:-x;
}

输出优化

void write(int x){
	if(x/10>0)write(x/10);
	putchar(char(x%10+'0'));
}
//怎么用:
if(n<0)putchar('-'),write(-n);
else write(n);

方向数组

//四方
int d1[4][2]={
   
   {1,0},{0,-1},{-1,0},{0,1}};
//八方
int d2[8][2]={
   
   {1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};
//用于平面DFS/BFS

坐标结构体

struct itn{
    int x,y;
    itn(){}
    itn(int X,int Y){
        x=X,y=Y;
    }
};

邻接表

//include<vector>
struct itn{
    int id,m;
};
vector<itn>G[MAXN];
G[x].push_back(y);//x->y的边

优先队列仿函数模板

struct itn{
	bool operator()(int a,int b) {
		putchar('>');
		return a<b; //从大到小、
		return a>b; //从小到大-二选一
    }
};
priority_queue<int,vector<int>,itn>p;

普通快速幂

inline long long ksm(long long a,long long b){
    long long res=1;
    for(;b;b>>=1){
        if(b&1)res=res*a%mod;
        a=a*a%mod;
    }
    return res;
}

递归快速幂

inline long long quickpow(long long x,long long y){
    if(y==0)return 1;
    if(y==1)return x;
    long long u=quickpow(x,y>>1);
    return u*u%mod*quickpow(x,y%2)%mod;
}

并查集

构造

int f[MAXN];
inline void makeSet(int n){ 
    for(int i=0;i<=n;i++) 
        f[i]=i;
}

查找

//普通:
inline int findSet(int x){
    while(x!=f[x])x=f[x];
    return f[x];
}
//路径压缩:
int findSet(int x){ 
    if(x!=f[x])f[x]=findSet(f[x]); 
    return f[x]; 
}

合并

//findSet如上
inline void unionSet(int x,int y){ 
    int u=findSet(x),v=findSet(y);
    if(u!=v)f[u]=v,tot++;
}

树状数组

准备&构造&维护

#define low(a) a&-a //*
int n,a[MAXN],c[MAXN];
inline void up(int x,int in){ //把c[x]加上in,c数组随之改变
    for(int o=x;o<=n;o+=low(o)){
        c[o]+=in;
    }
}
for(int i=1;i<=n;i++)up(i,a[i]);//初始化

前缀和

inline int som(int x){ //a[1~x]的和
    int B=0;
    for(int o=x;o>0;o-=low(o))B+=c[o];
    return B;
}
//a[l~r]的和:
som(r)-som(l)

指定年月算天数

inline int ds(int y,int m){//做模拟题时想起来了
	bool run=0;
	if(y%4==0&&y%100!=0)run=1;
	if(y%400==0)run=1;
	if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)return 31;
	else if(m==2)return run?29:28;
	else return 30;
}

欢迎各位读者发评论补充~

猜你喜欢

转载自blog.csdn.net/weixin_43960287/article/details/85337291