欢迎各位读者发评论补充(我会标明补充者的博客和链接)
目录
下一页: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)f^=(s=='-'),s=getchar();
while(s>='0'&&s<='9')x=(x<<1)+(x<<3)+(s^48),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 ptf[30],lpt;
inline void print(ll x,char c='\n'){
if(x<0)putchar('-'),x=-x;
ptf[lpt=1]=x%10;
while(x>9)x/=10,ptf[++lpt]=x%10;
while(lpt)putchar(ptf[lpt--]^48);
if(c>0)putchar(c);
}
//用法:print(x,' ')或print(x,'\n')
//print(x)默认换行
//想要后面不跟字符:print(x,0)
方向数组
//四方
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 edge{
int v,w;edge(){}
edge(int V,int W){v=V,w=W;}
};
vector<itn>G[MAXN];
G[x].push_back(edge(y,w));//x->y,边权w的边
优先队列仿函数模板
struct itn{
bool operator()(int a,int b) {
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 mo){
long long res=1;
for(;b;b>>=1,a=a*a%mo)if(b&1)res=res*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;
}
欢迎各位读者发评论补充~