板子
一些板子
弱智板子
-
快读快写
点击查看代码
inline int read(){
char ch=getchar();
int x=0,f=1;
while(!isdigit(ch)) if(ch=='-') f=-1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
inline void print(int n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9) print(n/10);
putchar(n%10+'0');
}
-
__int128(39位)
点击查看代码
__int128 read(){
__int128 res=0;
char scan[50];
scanf(" %s",scan);
for(int i=0;i<strlen(scan);i++){
res*=10;
res+=scan[i]-'0';
}
return res;
}
void print(__int128 num){
if(num>9){
print(num/10);
}
putchar(num%10+'0');
}
-
BFS
点击查看代码
void bfs(int x){//初始化略
q.push(x);
vis[x]=true;
while(!q.empty()){
int t=q.front();
printf("%d ",t);
q.pop();
for(int i=1;i<=n;i++){
if(g[t][i]&&!vis[i]){
q.push(i);
vis[i]=true;
}
}
}
}
-
DFS
点击查看代码
void dfs(int x){//初始化略
vis[x]=true;
printf("%d ",x);
for(int i=1;i<=n;i++){
if(!vis[i]&&g[x][i]){
dfs(i);
}
}
}
-
整数二分
点击查看代码
bool check(int x){
int l=1,r=n,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%d",ans);
}
-
埃氏筛
点击查看代码
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) a[i]=1;
for(int i=2;i<=n;i++){//从2开始
if(a[i]==0) continue;
for(int j=i;j<=n/i;j++){
a[i*j]=0;
}
}
for(int i=2;i<=n;i++){
if(a[i]) printf("%d\n", i);
}
return 0-0;
}
-
线性筛
点击查看代码
int n,vis[maxn],prim[maxn],cnt;
void get(){
for(int i=2;i<=n;i++){
if(!vis[i]){
prim[++cnt]=i;
}
for(int j=1;j<=cnt&&i*prim[j]<=n;j++){
vis[i*prim[j]]=1;
if(!i*prim[j]) break;
}
}
}
-
堆优化Dijkstra
点击查看代码
priority_queue<pair<int,int> > q;//>与>之间加空格
void addedge(int x,int y,int z){
to[++tot]=y;
nxt[tot]=h[x];
w[tot]=z;
h[x]=tot;
}
void dij(int x){
memset(dis,0x3f,sizeof(dis));
dis[x]=0;
q.push(make_pair(0, x));
while(q.size()){
x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=true;
for(int i=h[x];i;i=nxt[i]){
int y=to[i];
if(dis[y]>dis[x]+w[i]){
dis[y]=dis[x]+w[i];
q.push(make_pair(-dis[y],y));
}
}
}
}
-
Spfa
(屎怕)
点击查看代码
void addedge(int x,int y,int z){
to[++tot]=y;
nxt[tot]=h[x];
w[tot]=z;
h[x]=tot;
}
void spfa(int x){
memset(dis,0x3f,sizeof(dis));//初始化
dis[x]=0;
queue<int> q;
q.push(x);
vis[x]=true;
while(q.size()){
x=q.front();
q.pop();
vis[x]=false;
for(int i=h[x];i;i=nxt[i]){
int y=to[i];
if(dis[y]>dis[x]+w[i]){
dis[y]=dis[x]+w[i];
if(!vis[y]){
q.push(y);
vis[y]=true;
}
}
}
}
}
-
倍增LCA
点击查看代码
for(int j=1;j<30;j++){//初始化
for(int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
int d=dep[x]-dep[y];
for(int i=0;i<30;i++){
if(d&(1<<i)) x=f[x][i];
}
if(x==y) return x;
for(int i=29;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
if(f[x][0]==f[y][0]) break;
}
return f[x][0];
}
-
DP
赞美mz-xs
https://www.cnblogs.com/mz-xs/p/17981541
-
同余方程
点击查看代码
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int ret=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return ret;
}
-
最长上升子序列
点击查看代码
void out(int x){
if(x==0) return;
out(pre[x]);
printf("%d ",a[x]);
}
void LIS(){//n为原序列长度,a[]为原序列
int ans=1,te=0;
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<i;j++){
if(a[i]>a[j]&&f[i]<f[j]+1){
f[i]=f[j]+1;
pre[i]=j;
if(ans<f[i]){
ans=f[i];
te=i;
}
}
}
}
printf("max=%d\n",ans);
out(te);
}
-
矩阵
点击查看代码
struct Mat{
int a[maxn][maxn];
void zero(){
memset(a,0,sizeof(a));
}
void one(){
zero();
for(int i=1;i<=n;i++){
a[i][i]=1;
}
}
void resize(int x,int y){
n=x,m=y;
}
Mat operator +(const Mat &A) const{
Mat res;
res.resize(n,m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
res.a[i][j]=a[i][j]+A.a[i][j];
}
}
return res;
}
Mat operator -(const Mat &A) const{
Mat res;
res.resize(n,m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
res.a[i][j]=a[i][j]-A.a[i][j];
}
}
return res;
}
Mat operator *(const Mat &A) const{
Mat res;
res.resize(n,n);
res.zero();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
res.a[i][j]=((long long)a[i][k]*A.a[k][j]+res.a[i][j])%mod;
}
}
}
return res;
}
};
Mat qpow(Mat A,int b){
Mat res;
res.one();
while(b){
if(b&1) res=res*A;
A=A*A;
b>>=1;
}
return res;
}
-
Lucas
点击查看代码
ll qpow(ll x,ll y){
ll ret=1;
while(y){
if(y&1) ret=x*ret%mod;
x=x*x%mod;
y>>=1;
}
return ret;
}
ll C(ll x,ll y){
if(x<y) return 0;
return f[x]*qpow(f[y],mod-2)%mod*qpow(f[x-y],mod-2)%mod;
}
ll Lucas(ll x,ll y){
if(y==0) return 1;
return C(x%mod,y%mod)*Lucas(x/mod,y/mod)%mod;
}
ll ycl(){//预处理
f[0]=1;
for(int i=1;i<=mod;i++){
f[i]=f[i-1]*i%mod;
}
}
-
匈牙利算法
点击查看代码
bool find(int x){
for(int i=h[x];i;i=nxt[i]){
int y=to[i];
if(!vis[y]){
vis[y]=true;
//如果邻接点t是非匹配点,则找到一条增广路,匹配
//如果t已匹配过,但是能重新匹配,则也找到一条增广路
//让y与x匹配
if(!f[y]||find(f[y])){
f[y]=x;
return true;
}
}
}
return false;
}
int x_G(){//匈牙利算法求最大匹配
int ans=0;
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
if(find(i)) ans++;
}
return ans;
}
为啥折磨多板子

nothing
浙公网安备 33010602011771号