最基礎模板複習(持續更新)

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

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


ST表

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
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]<n;++i) mi[i]=mi[i-1]*2,sz=i;
	for(int i=1;i<=n;++i) st[i][0]=read();
	for(int i=1;i<=19&&mi[i];++i) for(int j=1;j<=n;++j) if(j+mi[i]-1<=n) {
		st[j][i]=max(st[j][i-1],st[j+mi[i-1]][i-1]);
	}
	for(int i=1;i<=m;++i) {
		x=read();y=read();
		z=sz;while(mi[z]>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<b.z;
}

int fa[maxn];
int find(int x) {
	return x==fa[x]? x:fa[x]=find(fa[x]);
}

void Kr() {
	for(int i=1;i<=n;++i) fa[i]=i;
	sort(edge+1,edge+m+1,cmp);
	int tot=0,xx,yy,ans=0;
	for(int i=1;i<=m&&tot<n-1;++i) {
		xx=find(edge[i].x);yy=find(edge[i].y);
		if(xx!=yy) {
			fa[xx]=yy; tot++; ans+=edge[i].z;
		}
	}
	if(tot==n-1) printf("%d",ans);
	else printf("orz");
}

樹狀數組

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<bits/stdc++.h>
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;i<n1;i++)
		a[i]=st1[st1.size()-i-1]-48;
	for (int i=0;i<n2;i++)
		b[i]=st2[st2.size()-i-1]-48;
	int l=max(n1,n2);
	for (int i=0;i<l;i++)
	{
		c[i]+=a[i]+b[i];
		if (c[i]>9)
		{
			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<<c[i];
	return 0;
}


高精減法

#include<bits/stdc++.h>
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;i<n1;i++)
		a[i]=st1[n1-i-1]-48;
	for (int i=0;i<n2;i++)
		b[i]=st2[n2-i-1]-48;
	if(n1<n2) ok=1;
	else if(n1==n2) {
		for(int i=0;i<n1;++i) {
			if(a[i]!=b[i]) {
				ok=a[i]<b[i];
				break;
			}
		}
	}
	if(ok==1) {
		cout<<"-";
		swap(a,b);swap(n1,n2);
	}
	int l=max(n1,n2);
	for (int i=0;i<l;i++)
	{
		c[i]+=a[i]-b[i];
		if (c[i]<0)
		{
			c[i+1]--;
			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<<c[i];
	return 0;
}


某神犇的高精模板

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<ctime>
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; //高進制位數
    vector<long long>s;
    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; i<len; i++)
        {
            int end=str.length()-i*WIDTH;
            int start=max(0,end-WIDTH);
            sscanf(str.substr(start,end-start).c_str(),"%lld",&x);
            s.push_back(x);
        }
        return *this;
    }
    //比較
    bool operator < (const BigInteger& b)
    {
        if(s.size()<b.s.size())return true;
        if(s.size()>b.s.size())return false;
        for(int i=s.size()-1; i>=0; i--)
        {
            if(s[i]<b.s[i])return true;
            if(s[i]>b.s[i])return false;
        }
        return false;
    }
    bool operator >= (const BigInteger& b)
    {
        return !(*this<b);
    }
    bool operator == (const BigInteger& b)
    {
        if(s.size()!=b.s.size())return false;
        for(int i=0; i<s.size(); i++)
            if(s[i]!=b.s[i])return false;
        return true;
    }
    //+
    BigInteger operator + (const BigInteger& b)
    {
        BigInteger c;
        c.s.clear();
        for(int i=0,g=0; ; i++)
            {
                if(g==0&&i>=s.size()&&i>=b.s.size())break;
                int x=g;
                if(i<s.size())x+=s[i];
                if(i<b.s.size())x+=b.s[i];
                c.s.push_back(x%BASE);
                g=x/BASE;
            }
        return c;
    }
    //-
    BigInteger operator - (const BigInteger& b)
    {
        BigInteger c;
        c=*this;
        for(int i=0; i<c.s.size(); i++)
            {
                int tmp;
                if(i>=b.s.size())tmp=0;
                else tmp=b.s[i];
                if(c.s[i]<tmp)
                    {
                        c.s[i+1]-=1;
                        c.s[i]+=BASE;
                    }
                c.s[i]-=tmp;
            }
        while(c.s.back()==0&&c.s.size()>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; i<s.size(); i++)
            for(int j=0; j<b.s.size(); j++)c.s[i+j]+=s[i]*b.s[j];
        for(int i=0; i<c.s.size()-1; i++)
            {
                c.s[i+1]+=c.s[i]/BASE;
                c.s[i]%=BASE;
            }
        while(c.s.back()==0&&c.s.size()>1)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<<x.s.back();
        for(int i=x.s.size()-2; i>=0; i--)
            {
                char buf[20];
                sprintf(buf,"%08d",x.s[i]);
                for(int j=0; j<strlen(buf); j++)output<<buf[j];
            }
        return output;
    }
};
// /
BigInteger Copy(const BigInteger& b,int x)
{
    BigInteger t;
    t.s.resize(b.s.size()+x);
    for(int i=0; i<b.s.size(); i++)t.s[i+x]=b.s[i];
    return t;
}
BigInteger Divide(const BigInteger& a,const BigInteger& b,BigInteger& mod)
{
    BigInteger c;
    c.s.resize(a.s.size()-b.s.size()+1);
    mod=a;
    int Pow[(int)log2(BigInteger::BASE)+5];
    Pow[0]=1;
    for(int i=1; i<=log2(BigInteger::BASE); i++)Pow[i]=Pow[i-1]*2;
    for(int i=c.s.size()-1; i>=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<b)
	cout<<a+b<<endl<<'-'<<b-a<<endl<<a*b<<endl<<0<<endl<<a<<endl;
    else
    {
        BigInteger c,d;
        c=Divide(a,b,d);
        cout<<a+b<<endl<<a-b<<endl<<a*b<<endl<<c<<endl<<d<<endl;
    }
    return 0;
}


縮點

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
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<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章