C++模板大全(持续更新,依不同网站整理而成)

这篇博客整理了C++的各种模板,包括基本模板如快读快写、火车头、缺省源,以及基本算法如二分、三分、排序等。还详细介绍了基础数据结构如栈、队列、哈希、链表,以及高级数据结构如树状数组、线段树、并查集等,并探讨了树上问题和平衡树。
摘要由CSDN通过智能技术生成

基本模板

快读

namespace IN{
   
    const int MAX_INPUT=1000000;
    #define getc()(p1==p2&&(p2=(p1=buf)+inbuf->sgetn(buf,MAX_INPUT),p1==p2)?EOF:*p1++)
    char buf[MAX_INPUT],*p1,*p2;
    template<typename T>inline bool read(T&x){
   
        static std::streambuf*inbuf=cin.rdbuf();
        x=0;
        register int f=0,flag=false;
        register char ch=getc();
        while(!isdigit(ch)){
   
            if(ch=='-'){
   
                f=1;
            }
            ch=getc();
        }
        if(isdigit(ch)){
   
            x=x*10+ch-'0';
            ch=getc();
            flag=true;
        }
        while(isdigit(ch)){
   
            x=x*10+ch-48;
            ch=getc();
        }
        x=f?-x:x;
        return flag;
    }
    template<typename T,typename ...Args>inline bool read(T&a,Args& ...args){
   
       return read(a)&&read(args...);
    }
    #undef getc
}
using namespace IN;

快写

namespace OUT{
   
    template<typename T>inline void put(T x){
   
        static std::streambuf *outbuf=cout.rdbuf();
        static char stack[21];
        static int top=0;
        if(x<0){
   
            outbuf->sputc('-');
            x=-x;
        }
        if(!x){
   
            outbuf->sputc('0');
            outbuf->sputc('\n');
            return;
        }
        while(x){
   
            stack[++top]=x%10+'0';
            x/=10;
        }
        while(top){
   
            outbuf->sputc(stack[top]);
            --top;
        }
        outbuf->sputc('\n');
    }
    inline void putc(const char ch){
   
        static std::streambuf *outbuf=cout.rdbuf();
        outbuf->sputc(ch);
    }
    inline void putstr(string s){
   
        for(register int i=0;i<s.length();i++) putc(s[i]);
    }
    template<typename T>inline void put(const char ch,T x){
   
        static std::streambuf *outbuf=cout.rdbuf();
        static char stack[21];
        static int top = 0;
        if(x<0){
   
            outbuf->sputc('-');
            x=-x;
        }
        if(!x){
   
            outbuf->sputc('0');
            outbuf->sputc(ch);
            return;
        }
        while(x){
   
            stack[++top]=x%10+'0';
            x/=10;
        }
        while(top){
   
            outbuf->sputc(stack[top]);
            --top;
        }
        outbuf->sputc(ch);
    }
    template<typename T,typename ...Args> inline void put(T a,Args ...args){
   
        put(a);put(args...);
    }
    template<typename T,typename ...Args> inline void put(const char ch,T a,Args ...args){
   
        put(ch,a);put(ch,args...);
    }
}
using namespace OUT;

快读快写

namespace IN{
   
    const int MAX_INPUT=1000000;
    #define getc()(p1==p2&&(p2=(p1=buf)+inbuf->sgetn(buf,MAX_INPUT),p1==p2)?EOF:*p1++)
    char buf[MAX_INPUT],*p1,*p2;
    template<typename T>inline bool read(T&x){
   
        static std::streambuf*inbuf=cin.rdbuf();
        x=0;
        register int f=0,flag=false;
        register char ch=getc();
        while(!isdigit(ch)){
   
            if(ch=='-'){
   
                f=1;
            }
            ch=getc();
        }
        if(isdigit(ch)){
   
            x=x*10+ch-'0';
            ch=getc();
            flag=true;
        }
        while(isdigit(ch)){
   
            x=x*10+ch-48;
            ch=getc();
        }
        x=f?-x:x;
        return flag;
    }
    template<typename T,typename ...Args>inline bool read(T&a,Args& ...args){
   
       return read(a)&&read(args...);
    }
    #undef getc
}
namespace OUT{
   
    template<typename T>inline void put(T x){
   
        static std::streambuf *outbuf=cout.rdbuf();
        static char stack[21];
        static int top=0;
        if(x<0){
   
            outbuf->sputc('-');
            x=-x;
        }
        if(!x){
   
            outbuf->sputc('0');
            outbuf->sputc('\n');
            return;
        }
        while(x){
   
            stack[++top]=x%10+'0';
            x/=10;
        }
        while(top){
   
            outbuf->sputc(stack[top]);
            --top;
        }
        outbuf->sputc('\n');
    }
    inline void putc(const char ch){
   
        static std::streambuf *outbuf=cout.rdbuf();
        outbuf->sputc(ch);
    }
    inline void putstr(string s){
   
        for(register int i=0;i<s.length();i++) putc(s[i]);
    }
    template<typename T>inline void put(const char ch,T x){
   
        static std::streambuf *outbuf=cout.rdbuf();
        static char stack[21];
        static int top = 0;
        if(x<0){
   
            outbuf->sputc('-');
            x=-x;
        }
        if(!x){
   
            outbuf->sputc('0');
            outbuf->sputc(ch);
            return;
        }
        while(x){
   
            stack[++top]=x%10+'0';
            x/=10;
        }
        while(top){
   
            outbuf->sputc(stack[top]);
            --top;
        }
        outbuf->sputc(ch);
    }
    template<typename T,typename ...Args> inline void put(T a,Args ...args){
   
        put(a);put(args...);
    }
    template<typename T,typename ...Args> inline void put(const char ch,T a,Args ...args){
   
        put(ch,a);put(ch,args...);
    }
}
using namespace IN;
using namespace OUT;

火车头

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")

缺省源

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
#define int long long
#define ofr(x,y,z) for(int x=y;x<=z;x++)
#define rfr(x,y,z) for(int x=y;x>=z;x--)
using namespace std; 
namespace IN{
   
    const int MAX_INPUT=1000000;
    #define getc()(p1==p2&&(p2=(p1=buf)+inbuf->sgetn(buf,MAX_INPUT),p1==p2)?EOF:*p1++)
    char buf[MAX_INPUT],*p1,*p2;
    template<typename T>inline bool read(T&x){
   
        static std::streambuf*inbuf=cin.rdbuf();
        x=0;
        register int f=0,flag=false;
        register char ch=getc();
        while(!isdigit(ch)){
   
            if(ch=='-'){
   
                f=1;
            }
            ch=getc();
        }
        if(isdigit(ch)){
   
            x=x*10+ch-'0';
            ch=getc();
            flag=true;
        }
        while(isdigit(ch)){
   
            x=x*10+ch-48;
            ch=getc();
        }
        x=f?-x:x;
        return flag;
    }
    template<typename T,typename ...Args>inline bool read(T&a,Args& ...args){
   
       return read(a)&&read(args...);
    }
    #undef getc
}
namespace OUT{
   
    template<typename T>inline void put(T x){
   
        static std::streambuf *outbuf=cout.rdbuf();
        static char stack[21];
        static int top=0;
        if(x<0){
   
            outbuf->sputc('-');
            x=-x;
        }
        if(!x){
   
            outbuf->sputc('0');
            outbuf->sputc('\n');
            return;
        }
        while(x){
   
            stack[++top]=x%10+'0';
            x/=10;
        }
        while(top){
   
            outbuf->sputc(stack[top]);
            --top;
        }
        outbuf->sputc('\n');
    }
    inline void putc(const char ch){
   
        static std::streambuf *outbuf=cout.rdbuf();
        outbuf->sputc(ch);
    }
    inline void putstr(string s){
   
        for(register int i=0;i<s.length();i++){
   
            putc(s[i]);
        }
    }
    template<typename T>inline void put(const char ch,T x){
   
        static std::streambuf *outbuf=cout.rdbuf();
        static char stack[21];
        static int top=0;
        if(x<0){
   
            outbuf->sputc('-');
            x=-x;
        }
        if(!x){
   
            outbuf->sputc('0');
            outbuf->sputc(ch);
            return;
        }
        while(x){
   
            stack[++top]=x%10+'0';
            x/=10;
        }
        while(top){
   
            outbuf->sputc(stack[top]);
            --top;
        }
        outbuf->sputc(ch);
    }
    template<typename T,typename ...Args> inline void put(T a,Args ...args){
   
        put(a);
        put(args...);
    }
    template<typename T,typename ...Args> inline void put(const char ch,T a,Args ...args){
   
        put(ch,a);
        put(ch,args...);
    }
}
using namespace IN;
using namespace OUT;
void openfile(){
   
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}
int main(){
   
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    
    return 0;
}

emmm…下面开始回归正题了

基本算法

暴力枚举

抱歉,暴力枚举没有模板

模拟

抱歉,模拟没有模板.

贪心

抱歉,贪心没有模板

二分

注意,使用二分前要注意该序列的单调性.

while (l <= r) {
   
    mid = (l 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqbzcyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值