一些小模板总结
臨近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
總結
- 上一篇: 使用Charles为Android设备抓
- 下一篇: 关于缘起