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();

強力で改善されたバージョン(定数は小さく、長く読み、ファイルの終わりに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
おすすめ