首页 > 代码库 > 好用的模板(不断增补中)

好用的模板(不断增补中)

好用的模板……有需要的拿去

在使用中如发现bug欢迎留言指出

1、打codeforces的比赛的时候是不是像我一样感觉时间不够用,恨不得多长几只手打代码?其实看看神犇的代码会发现,他们为节省时间都是直接在编译器的缺省值里打一堆头文件,还有一些神奇的#define……balabala的,我把自己打cf常用的头文件还有一些常用的define,以及快速读入搞成模板放上来

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<ctime>
#define LL long long
#define inf 0x7ffffff
#define pa pair<int,int>
#define pi 3.1415926535897932384626433832795028841971
using namespace std;
inline LL read()
{
    LL x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int main()
{
}

2、高精度实在是让人头疼的东西,每次写加减乘除读入输出都好麻烦……目前写了非负高精整数的加减乘minmax……放模板

#define mx 100//高精位数
struct gaojing{
     int len;
     int a[mx+10];
};//定义高精度非负数类型
inline void set0(gaojing &s)//高精清零
{
    s.len=1;
    for (int i=1;i<=mx+5;i++)s.a[i]=0;
}
inline void inputn(gaojing &a)//高精输入
{  
	set0(a);
    char ch=getchar();
    while (ch<'0'||ch>'9')ch=getchar();  
    while (ch>='0'&&ch<='9')  
    {  
        a.a[a.len++]=ch-'0';
        ch=getchar();
    }
    a.len--;  
    int change[mx+15];
    for (int i=1;i<=a.len;i++)  
      change[i]=a.a[i];  
    for (int i=1;i<=a.len;i++)  
      a.a[i]=change[a.len-i+1];
    while (a.a[a.len]==0)a.len--;
}  
inline void put(gaojing a)//高精输出并换行
{    
    for (int i=a.len;i>=1;i--)printf("%d",a.a[i]);
    printf("\n");
}
inline int cmp(const gaojing &a,const gaojing &b)//比较:a<b:1  a>b:-1  a==b:0  
{  
    if (a.len!=b.len)  
    {  
        if (a.len<b.len)return 1;  
        else return -1;  
    }  
    for (int i=a.len;i>=1;i--)
      if(a.a[i]<b.a[i])return 1;
      else if (a.a[i]>b.a[i])return -1;
    return 0;
}  
inline gaojing max(const gaojing &a,const gaojing &b)//高精度max 
{  
    int opr=cmp(a,b);
    if (opr==1)return b;
    else return a;
}
inline gaojing min(const gaojing &a,const gaojing &b)//高精度min
{
	int opr=cmp(a,b);
	if (opr==1)return a;
	else return b;
} 
inline gaojing operator + (const gaojing &a,const gaojing &b)//高精度加法
{  
    gaojing c;set0(c);  
    int maxlen=max(a.len,b.len);      
    for (int i=1;i<=maxlen;i++)      
    {      
        c.a[i]=c.a[i]+a.a[i]+b.a[i];      
        if (c.a[i]>=10)      
        {      
            c.a[i+1]+=c.a[i]/10;    
            c.a[i]%=10;    
        }    
    }      
    c.len=maxlen+4;      
    while (!c.a[c.len]&&c.len>1) c.len--;    
    return c;
}
inline gaojing operator - (const gaojing &a,const gaojing &b)//高精度减法,需保证a>b
{  
	gaojing c;set0(c);
	gaojing d;d=a;
    for (int i=1;i<=b.len;i++)  
      {  
        c.a[i]=d.a[i]-b.a[i];  
        if (c.a[i]<0)  
        {  
            c.a[i]+=10;  
            int now=i+1;  
            while (!d.a[now])  
            {  
                d.a[now]=9;  
                now++;  
            }  
            d.a[now]--;  
        }  
      }
    for (int i=b.len+1;i<=d.len;i++)c.a[i]=d.a[i];  
    c.len=d.len;  
    while (c.a[c.len]==0&&c.len>1)c.len--;
    return c;
}  
inline gaojing operator * (const gaojing &a,const gaojing &b)//高精度乘法
{  
    gaojing c;set0(c);    
    for(int i=1;i<=a.len;i++)    
      for (int j=1;j<=b.len;j++)    
        c.a[i+j-1]+=a.a[i]*b.a[j];    
    int mxlen=a.len+b.len+5;  
    for (int i=1;i<=mxlen;i++)    
      {    
        c.a[i+1]+=c.a[i]/10;    
        c.a[i]%=10;    
      }    
    while (c.a[mxlen]==0)mxlen--;    
    c.len=mxlen;    
    return c;
}

不断更新中

好用的模板(不断增补中)