日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一些小模板总结

發布時間:2024/8/26 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一些小模板总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

臨近noip了,在此整理一下一些小模板,算是自己的復習,也給一些萌新一點福利。
~\ (≧▽≦) /~

—————————————————靈夢鎮樓——————————————————-

————————————————–靈夢鎮樓—————————————————————

最小生成樹(kruskal):

int kruskal() {int ans=0;for(int i=1;i<=n;i++){fa[i]=i;}sort(tree+1,tree+m+1,cmp);for(int i=1;i<=m;i++){if(find(tree[i].from)!=find(tree[i].to)){fa[find(tree[i].from)]=find(tree[i].to);ans+=tree[i].cost;}}return ans; }

最短路(spfa):

void spfa(int s) {q.push(s);vis[s]=1;dis[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=first[u];i;i=next[i]){int v=es[i].to;if(dis[v]>dis[u]+es[i].cost){dis[v]=dis[u]+es[i].cost;if(!vis[v]){q.push(v);vis[v]=1;}}} } }

篩素數(埃氏篩法):

bool isprime() { memset(prime,1,sizeof(prime));prime[0]=prime[1]=0;for(int i=2;i<=n;i++){if(prime[i]){for(int j=i*i;j<=n;j+=i){prime[j]=0; }}} }

倍增lca:

int dfs(int x) {vis[x]=1;for(int i=1;i<=20;i++){if(deep[x]>=(1<<i)){fa[x][i]=fa[fa[x][i-1]][i-1];dis[x][i]=dis[fa[x][i-1]][i-1]+dis[x][i-1];}}for(int i=first[x];i;i=next[i]){if(!vis[es[i].to]){fa[es[i].to][0]=x;dis[es[i].to][0]=es[i].cost;deep[es[i].to]=deep[x]+1;dfs(es[i].to);}} } int lca(int x,int y) {if(deep[x]<deep[y]){swap(x,y);}int t=deep[x]-deep[y];for(int i=0;i<=20;i++){if((t&(1<<i))!=0){x=fa[x][i];}if(x==y){return x;}}for(int i=20;i>=0;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i],y=fa[y][i];}}return fa[x][0]; } int ask(int x,int f) {int s=0;int t=deep[x]-deep[f];for(int i=0;i<=20;i++){if((t&(1<<i))!=0){s+=dis[x][i];x=fa[x][i];}}return s; }

Tarjan算法求強連通分量:

int dfs(int u) {int lowu=pre[u]=++cnt;s.push(u);for(int i=first[u];i;i=next[i]){int v=es[i].to;if(!pre[v]){int lowv=dfs(v);lowu=min(lowu,lowv);}else if(!scc_num[v]){lowu=min(lowu,pre[v]);}}if(lowu==pre[u]){scc_cnt++;while(!s.empty()){int v=s.top();s.pop();scc_num[v]=scc_cnt;if(v==u){break;}}}return lowu; }

拓撲排序:

void TopoSort() {for(int i=1;i<=n;i++){if(!ru[i]&&!vis[i]){printf("%d ",a[i]);vis[i]=1;for(int j=first[i];j;j=next[j]){int u=es[j].to;if(!vis[u]){ru[u]--;if(!ru[u]){TopoSort();}}}}} }

線段樹:

樹狀數組:

擴展歐幾里德:

區間最值:

—————————————————我是華麗的分割線——————————————————-

歸并排序求逆序對:

#include<iostream> #include<cstdio> using namespace std; int num[40005]; int temp[40005]; int ans=0; void ask(int l,int r) {if(l==r){return;}int mid=(l+r)/2;ask(l,mid),ask(mid+1,r);int p=l,pl=l,pr=mid+1;while(pl<=mid||pr<=r){if(pr>r||(pl<=mid&&num[pl]<=num[pr])){temp[p]=num[pl]; p++,pl++;}else{ans+=mid-pl+1;temp[p]=num[pr];p++,pr++;}}for(int i=l;i<=r;i++){num[i]=temp[i];}return; } int main() {int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&num[i]);}ask(1,n);printf("%d",ans);return 0; }

floyod(汗~):

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[105][105]; int main() {memset(dp,63,sizeof(dp));int n;scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&dp[i][j]);dp[j][i]=dp[i][j];}}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(k!=i&&i!=j&&j!=k){dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); } }}}int m;scanf("%d",&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);printf("%d\n",dp[x][y]);}return 0; }

快速冪:

#include<iostream> #include<cstdio> using namespace std; long long ksm(long long a,long long b,long long c) {if(b==0){return 1;}long long ans=ksm(a,b/2,c);ans=((ans%c)*(ans%c))%c;if(b%2==1){ans=((ans%c)*(a%c))%c;}return ans; } int main() {long long a,b,c;scanf("%lld%lld%lld",&a,&b,&c);printf("%lld",ksm(a,b,c));return 0; }

高精度:額,隨便吧,noip不好說,有興趣的去翻翻我的博客吧。

矩陣斐波那契:

#include<iostream> #include<cstdio> using namespace std; const int mod=10000; struct matrix{int m[2][2]; }base,ans; matrix multi(matrix a,matrix b) {matrix tmp;for(int i=0;i<2;i++){for(int j=0;j<2;j++){tmp.m[i][j]=0;for(int k=0;k<2;k++){tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%mod;}}}return tmp; } int ksm(int n) {base.m[0][0]=base.m[1][0]=base.m[0][1]=1,base.m[1][1]=0;ans.m[0][0]=ans.m[1][1]=1,ans.m[0][1]=ans.m[1][0]=0;while(n){if(n%2==1){ans=multi(ans,base);}base=multi(base,base);n/=2;}return ans.m[0][1]; } int main() {int n;scanf("%d",&n);printf("%d",ksm(n));return 0; }

差分:

#include<iostream> #include<cstdio> using namespace std; const int maxn=25000; int n,m; int num[maxn]; int pre[maxn]; int main() {scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&num[i]);}scanf("%d",&m);for(int i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);pre[x]+=z;pre[y+1]-=z;}for(int i=1;i<=n;i++){pre[i]+=pre[i-1];num[i]+=pre[i];}for(int i=1;i<=n;i++){printf("%d ",num[i]);}return 0; }

ps:可能還有很多其他模板,這里就不再多放了,要學會整理屬于自己的模板,才能在需要用到它時得心應手。

轉載于:https://www.cnblogs.com/-feather/p/7779887.html

總結

以上是生活随笔為你收集整理的一些小模板总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。