[留档]基础模板(持续更新中)

(mathfrak{CSP-S 2020 RP++})
(mathbb{CSP-S 2020 RP++})
(mathcal{CSP-S 2020 RP++})
(mathtt{CSP-S 2020 RP++})
(mathsf{CSP-S 2020 RP++})
(mathit{CSP-S 2020 RP++})

快读

inline void Read(int &x){
	int f=1;x=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-48;
		c=getchar();
	}
	x*=f;
}

倍增LCA

int dep[N],f[N][20];
struct Edge {
	int to,nxt;
}e[N<<1];
int head[N],cnt;
void ade(int u,int v){
	e[++cnt].to=v,e[cnt].nxt=head[u],head[u]=cnt;
}
void DFS(int now,int ff){
	dep[now]=dep[ff]+1;
	f[now][0]=ff;
	for(int i=1;i<=19;i++){
		f[now][i]=f[f[now][i-1]][i-1];
	}
	for(int i=head[now];i;i=e[i].nxt){
		int v=e[i].to;
		if(v!=ff)DFS(v,now);
	}
}
inline int LCA(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	for(int i=19;i>=0;i--){
		if(dep[f[u][i]]>=dep[v])u=f[u][i];
	}
	if(u==v)return u;
	for(int i=19;i>=0;i--){
		if(f[u][i]!=f[v][i]){
			u=f[u][i],v=f[v][i];
		}
	}
	return f[u][0];
}

一个常数有一点大的高精

struct BigNumber {
	int len,sgn;
	string s;
	BigNumber(string _s=""){
		s=_s,len=_s.size(),sgn=1;
	}
	void Read(){
		string _s;cin>>_s;
		s=_s,len=s.size(),sgn=1;
	}
	void Erase(){
		s.erase(0,s.find_first_not_of('0'));
		if(s=="")s="0";
	}
};
void Print(BigNumber a){
	if(a.sgn==-1)putchar('-');
	cout<<a.s<<endl;
}
bool operator < (BigNumber a,BigNumber b){
	if(a.sgn!=b.sgn)return a.sgn<b.sgn;
	if(a.len!=b.len)return a.len<b.len;
	for(int i=0;i<a.len;i++){
		if(a.s[i]!=b.s[i])return a.s[i]<b.s[i];
	}
	return 0;
}
bool operator == (BigNumber a,BigNumber b){
	if(a.sgn!=b.sgn)return 0;
	if(a.len==b.len){
		for(int i=0;i<a.len;i++){
			if(a.s[i]!=b.s[i])return 0;
		}
		return 1;
	}
	return 0;
}
BigNumber operator + (BigNumber a,BigNumber b){
	BigNumber ans;
	if(a.len<b.len)for(int i=0;i<b.len-a.len;i++)a.s="0"+a.s;
	else if(b.len<a.len)for(int i=0;i<a.len-b.len;i++)b.s="0"+b.s;
	int sum=0,up=0;
	a.len=a.s.size(),b.len=b.s.size();
	for(int i=a.len-1;i>=0;i--){
		sum=a.s[i]+b.s[i]-96+up;
		up=sum/10,sum%=10;
		ans.s=(char)(sum+48)+ans.s;
	}
	if(up)ans.s=(char)(up+48)+ans.s;
	ans.Erase(),ans.len=ans.s.size();
	return ans;
}
BigNumber operator - (BigNumber a,BigNumber b){
	BigNumber ans;
	if(a<b){
		swap(a,b),ans.sgn=-1;
	}
	int len=a.len-b.len,dn=0;
	for(int i=b.len-1;i>=0;i--){
		if(a.s[len+i]<b.s[i]+dn)ans.s=(char)(a.s[len+i]-b.s[i]-dn+58)+ans.s,dn=1;
		else ans.s=(char)(a.s[len+i]-b.s[i]-dn+48)+ans.s,dn=0;
	}
	for(int i=len-1;i>=0;i--){
		if(a.s[i]-'0'<dn)ans.s=(char)(a.s[i]-dn+10)+ans.s,dn=1;
		else ans.s=(char)(a.s[i]-dn)+ans.s,dn=0;
	}
	ans.Erase();ans.len=ans.s.size();
	return ans;
}
BigNumber operator * (BigNumber a,BigNumber b){
	BigNumber ans;
	for(int i=b.len-1;i>=0;i--){
		BigNumber tmp;
		int pro=0,up=0,now=b.s[i]-48;
		if(now!=0){
			for(int j=1;j<b.len-i;j++)tmp.s+="0";
			for(int j=a.len-1;j>=0;j--){
				pro=now*(a.s[j]-48)+up;
				up=pro/10,pro%=10;
				tmp.s=(char)(pro+48)+tmp.s;
			}
			if(up)tmp.s=(char)(up+48)+tmp.s;
			tmp.len=tmp.s.size();
		}
		ans=ans+tmp;
	}
	ans.Erase(),ans.len=ans.s.size();
	return ans;
}
BigNumber operator / (BigNumber a,BigNumber b){
	BigNumber ans,tmp;
	tmp.s.append(a.s,0,b.len-1),tmp.len=tmp.s.size();
	for(int i=b.len-1;i<a.len;i++){
		tmp.s+=a.s[i],tmp.Erase(),tmp.len=tmp.s.size();
		for(char c='9';c>='0';c--){
			BigNumber now,newans;
			now.s+=c,now.len=1;
			newans=now*b,newans.len=newans.s.size();
			if(newans<tmp||newans==tmp){
				ans.s+=c;
				tmp=tmp-newans;
				break;
			}
		}
	}
	ans.Erase(),ans.len=ans.s.size();
	return ans;
}
int main(){
	BigNumber a,b;
	a.Read(),b.Read();
	Print(a+b);
	Print(a-b);
	Print(a*b);
	BigNumber q=a/b;
	Print(q);
	Print(a-b*q);
	return 0;
}

Tarjan and Toposort

#define N 10010
#define M 100010
int n,m,num[N],ind[N],ans;
int dfn[N],low[N],tim;
int col[N],vis[N],tot;
int dis[N],f[N],topo[N],ctop;
vector<int>out[N],in[N];
//边表代码省略了
stack<int>s;
void Tarjan(int u){
	dfn[u]=low[u]=++tim;
	s.push(u),vis[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(!dfn[v]){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(vis[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	int v;
	if(dfn[u]==low[u]){
		tot++;
		do {
			v=s.top(),s.pop();
			vis[v]=0,col[v]=tot;
			dis[tot]+=num[v];
		} while(u!=v);
	}
} 
void Toposort(){
	queue<int>q;
	for(int i=1;i<=tot;i++){
		if(!ind[i])q.push(i);
	}
	while(!q.empty()){
		int u=q.front();q.pop();
		topo[++ctop]=u;
		for(int i=0;i<out[u].size();i++){
			int v=out[u][i];
			if(!--ind[v])q.push(v);
		}
	}
}
int main(){
	Read(n),Read(m);
	for(int i=1;i<=n;i++)Read(num[i]);
	//加边代码省略了
	for(int i=1;i<=n;i++){
		if(!dfn[i])Tarjan(i);
	}
	for(int i=1;i<=cnt;i++){
		if(col[e[i].frm]!=col[e[i].to]){
			int u=col[e[i].frm],v=col[e[i].to];
			out[u].push_back(v);
			in[v].push_back(u);
			ind[v]++;
		}
	}
	Toposort();
	for(int i=1;i<=tot;i++){
		int u=topo[i];
		f[u]=dis[u];
		for(int j=0;j<in[u].size();j++){
			f[u]=max(f[u],f[in[u][j]]+dis[u]);
		}
	}
	for(int i=1;i<=tot;i++){
		ans=max(ans,f[i]);
	}
	cout<<ans<<endl;
	return 0;
}

Dijkstra

#define N 100010
int n,m,s,dis[N];
bool vis[N];
//边表代码省略了
struct Node {
	int idx;
	int dis;
};
bool operator < (Node a,Node b){
	return a.dis>b.dis;//STL默认大根堆,所以要反过来
}
priority_queue<Node>q;
void Dijkstra(){
	dis[s]=0,q.push((Node){s,0});
	while(!q.empty()){
		Node tmp=q.top();q.pop();
		int u=tmp.idx;
		if(!vis[u]){
			vis[u]=1;
			for(int i=head[u];i;i=e[i].nxt){
				int v=e[i].to,w=e[i].wei;
				if(dis[v]>dis[u]+w){
					dis[v]=dis[u]+w;
					if(!vis[v]){
						q.push((Node){v,dis[v]});
					}
				}
			}
		}
	}
}
int main(){
	Read(n),Read(m),Read(s);
	for(int i=1;i<=n;i++)dis[i]=0x7fffffff;
	//加边代码省略了
	Dijkstra();
	for(int i=1;i<=n;i++)cout<<dis[i]<<" ";
	return 0;
}

死了的SPFA

void SPFA(){
	queue<int>q;
	for(int i=1;i<=n;i++)dis[i]=0x7fffffff;
	dis[s]=0,q.push(s),vis[s]=1;
	while(!q.empty()){
		int u=q.front();q.pop();vis[u]=0;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to,w=e[i].wei;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				if(!vis[v]){
					q.push(v),vis[v]=1;
				}
			}
		}
	}
}

树的直径

#define N 10010
int n,pos,ans;
//边表代码省略了
void DFS(int now,int ff,int dep){
	if(dep>ans){
		pos=now,ans=dep;
	}
	for(int i=head[now];i;i=e[i].nxt){
		int v=e[i].to;
		if(v!=ff)DFS(v,now,dep+1);
	}
}
int main(){
	Read(n);
	//加边代码省略了
	DFS(1,0,0),DFS(pos,0,0);
	cout<<ans<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/juruoajh/p/13933615.html