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


    (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;
    }
    
  • 相关阅读:
    Markdown学习
    二叉树的最近公共祖先
    javaCompiler简析
    自定义类加载器
    聚合和组合的区别
    拓扑排序
    C++ map和unordered_map
    静态文件加载路径
    文件上传
    jackson
  • 原文地址:https://www.cnblogs.com/juruoajh/p/13933615.html
Copyright © 2020-2023  润新知