最基础模板复习(持续更新)

快速排序(不知道有什么用)

void qsort(int l,int r) {
    int i=l,j=r,mid=a[(l+r)>>1];
    do {
        while(a[i]mid) j--;
        if(i<=j) {
            swap(a[i],a[j]);
            i++;j--;
        }
    }while(i<=j);
    if(j>l) qsort(l,j);
    if(i


ST表

//Serene
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=2e5+10;
int n,m,st[maxn][19],mi[20];

int aa;char cc;
int read() {
	aa=0;cc=getchar();
	while(cc<'0'||cc>'9') cc=getchar();
	while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
	return aa;
}

int main() {
	n=read();m=read();
	int x,y,z,sz;mi[0]=1;
	for(int i=1;i<=19&&mi[i-1]y-x+1) z--;
		printf("%d\n",max(st[x][z],st[y-mi[z]+1][z]));
	}
	return 0;
}


线性筛素数

int prime[maxn/10],tot_p;
bool vis[maxn];
void get_p() {
	vis[1]=1;
	for(int i=2;i<=n;++i) {
		if(!vis[i]) prime[++tot_p]=i;
		for(int j=1;j<=tot_p&&prime[j]<=n/i;++j) {
			vis[prime[j]*i]=1;
			if(i%prime[j]==0) break;
		}
	}
}


最小生成树

struct Edge{
	int x,y,z;
}edge[maxm];

bool cmp(const Edge& a,const Edge& b) {
	return a.z

树状数组

int lb(int x) {
	return x&(-x);
}

void add(int pos,int x) {
	while(pos<=n) {
		sz[pos]+=x;
		pos+=lb(pos);
	} 
}

int rs;
int q(int pos) {
	rs=0;
	while(pos) {
		rs+=sz[pos];
		pos-=lb(pos);
	}
	return rs;
}


高精加法

#include
using namespace std;
int a[50000],b[50000],c[50000];
int main(){
	string st1,st2;
	cin>>st1>>st2;
	int n1=st1.size();
	int n2=st2.size();
	for (int i=0;i9)
		{
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
	while(c[l]!=0) l++;
	while(c[l-1]==0&&l>1) l--;
	for(int i=l-1;i>=0;i--) cout<


高精减法

#include
using namespace std;
int a[50000],b[50000],c[50000];
bool ok=0;
int main(){
	string st1,st2;
	cin>>st1>>st2;
	int n1=st1.size();
	int n2=st2.size();
	for (int i=0;i1) l--;
	for(int i=l-1;i>=0;i--) cout<


某神犇的高精模板

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline const int Get_Int()
{
    int num=0,bj=1;
    char x=getchar();
    while(x<'0'||x>'9')
    {
        if(x=='-')bj=-1;
    	x=getchar();
    }
    while(x>='0'&&x<='9')
    {
        num=num*10+x-'0';
        x=getchar();
    }
    return num*bj;
}
struct BigInteger
{
    static const int BASE=100000000; //高进制
    static const int WIDTH=8; //高进制位数
    vectors;
    BigInteger()   //构造函数:初始赋0
    {
        *this=0;
    }
    BigInteger(const int& num)   // 构造函数
    {
        *this=num;
    }
    //赋值
    BigInteger operator = (int num)
    {
        s.clear();
        do
        {
            s.push_back(num%BASE);
            num/=BASE;
        }while(num>0);
        return *this;
    }
    BigInteger operator = (const string& str)
    {
        s.clear();
        int x,len=(str.length()-1)/WIDTH+1;
        for(int i=0; ib.s.size())return false;
        for(int i=s.size()-1; i>=0; i--)
        {
            if(s[i]b.s[i])return false;
        }
        return false;
    }
    bool operator >= (const BigInteger& b)
    {
        return !(*this=s.size()&&i>=b.s.size())break;
                int x=g;
                if(i=b.s.size())tmp=0;
                else tmp=b.s[i];
                if(c.s[i]1)c.s.pop_back();
        return c;
    }
    void operator -= (const BigInteger& b)
    {
        *this=*this-b;
    }
    //*
    BigInteger operator * (const BigInteger& b)
    {
        BigInteger c;
        c.s.resize(s.size()+b.s.size());
        for(int i=0; i1)c.s.pop_back();
        return c;
    }
    friend istream& operator >> (istream& input,BigInteger& x)
    {
        string s;
        if(!(input>>s))return input;
        x=s;
        return input;
    }
    friend ostream& operator << (ostream& output,const BigInteger& x)
    {
        output<=0; i--)
            {
                char buf[20];
                sprintf(buf,"%08d",x.s[i]);
                for(int j=0; j=0; i--)
    {
        BigInteger t;
        t=Copy(b,i);
        for(int j=log2(BigInteger::BASE); j>=0; j--)
          if(mod>=t*Pow[j])
          {
              c.s[i]+=Pow[j];
              mod-=t*Pow[j];
          }
    }
    while(c.s.back()==0&&c.s.size()>1)
	  c.s.pop_back();
    return c;
}
BigInteger a,b;
int main()
{
    cin>>a>>b;
    if(a


缩点

//Serene
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1e4+10,maxm=1e5+10;
int n,m,v[maxn],ans;

int aa;char cc;
int read() {
	aa=0;cc=getchar();
	while(cc<'0'||cc>'9') cc=getchar();
	while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
	return aa;
}

int fir[maxn],nxt[maxm],to[maxm],e=0;
void add(int x,int y) {
	to[++e]=y;nxt[e]=fir[x];fir[x]=e;
}

bool vis[maxn],inz[maxn];
int id[maxn],top[maxn],zz[maxn],d=0,t=0;
int xd[maxn],sum[maxn],tot_x;
void tj(int pos) {
	vis[pos]=1;zz[++t]=pos;inz[pos]=1;
	top[pos]=id[pos]=++d;
	for(int y=fir[pos];y;y=nxt[y]) {
		if(vis[to[y]]&&inz[to[y]]) top[pos]=min(top[pos],top[to[y]]);
		if(vis[to[y]]) continue;
		tj(to[y]);
		top[pos]=min(top[pos],top[to[y]]);
	}
	if(top[pos]==id[pos]) {
		sum[++tot_x]=0;
		while(t){
			xd[zz[t]]=tot_x;
			sum[tot_x]+=v[zz[t]];
			inz[zz[t--]]=0;
			if(zz[t+1]==pos) break;
		}
	}
}

int rd[maxn];
int ff[maxn],nn[maxm],tt[maxm],ee=0;
void add2(int x,int y) {
	tt[++ee]=y;nn[ee]=ff[x];ff[x]=ee;
	rd[y]++;
}

int ga(int pos) {
	int rs=0;
	for(int y=ff[pos];y;y=nn[y]) rs=max(rs,ga(tt[y]));
	return rs+sum[pos];
}

int main() {
	n=read();m=read(); int x,y;
	for(int i=1;i<=n;++i) v[i]=read();
	for(int i=1;i<=m;++i) {
		x=read();y=read();
		add(x,y);
	}
	for(int i=1;i<=n;++i) if(!vis[i]) tj(i);
	for(int i=1;i<=n;++i) {
		for(int j=fir[i];j;j=nxt[j]) {
			if(xd[to[j]]^xd[i]) add2(xd[i],xd[to[j]]);
		}
	}
	for(int i=1;i<=tot_x;++i) if(!rd[i]) ans=max(ans,ga(i));
	printf("%d",ans);
	return 0;
}


割点

//Serene
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=100000+10;
int n,m,ans;

int aa;char cc;
int read() {
	aa=0;cc=getchar();
	while(cc<'0'||cc>'9') cc=getchar();
	while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
	return aa;
}

int fir[maxn],nxt[2*maxn],to[2*maxn],e=0;
void add(int x,int y) {
	to[++e]=y;nxt[e]=fir[x];fir[x]=e;
	to[++e]=x;nxt[e]=fir[y];fir[y]=e;
}

int id[maxn],top[maxn],d=0;
bool cut[maxn],vis[maxn];
void tj(int pos,int fa) {
	id[pos]=top[pos]=++d;vis[pos]=1;
	int tot=0;
	for(int y=fir[pos];y;y=nxt[y]) {
		if(vis[to[y]]) {
			if(to[y]!=fa)top[pos]=min(top[pos],id[to[y]]);//
			continue;
		}
		tj(to[y],pos);tot++;
		if(id[pos]!=1&&top[to[y]]>=id[pos]) cut[pos]=1;
		top[pos]=min(top[pos],top[to[y]]);
	}
	if(id[pos]==1&&tot>1) cut[pos]=1;//
	if(cut[pos]) ans++;
}

int main() {
	n=read(); m=read(); int x,y;
	for(int i=1;i<=m;++i) {
		x=read();y=read();
		add(x,y);
	}
	for(int i=1;i<=n;++i) if(!vis[i]) {
		d=0;tj(i,0);
	}
	printf("%d\n",ans);
	for(int i=1;i<=n;++i) if(cut[i]) printf("%d ",i);
	return 0;
}


你可能感兴趣的:(模版)