堆(优先级队列)
priority_queue<int,vector<int>>//大根堆
priority_queue<int,vector<int>,greater<int>>//小根堆
用来维护最值
ST表用来静态查找区间的值(可以是最大值,最小值,以及满足区间分两半求值不影响结果的值)
dp[i][j]表示从区间i开始长度为2^j的数组值
1 int dp[N][35]; 2 int main(){ 3 int n; 4 cin>>n; 5 for(int i=0;i<n;++i){ 6 cin>>dp[i][0]; 7 } 8 for(int j=1;j<=log2(n);++j){ 9 for(int i=0;i+(1<<j)<=n;++i){ 10 dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); 11 } 12 } 13 int l,r; 14 cin>>l>>r; 15 int j=log2(r-l+1); 16 cout<<max(ma[l][j],ma[r-(1<<j)+1][j]); 17 return 0; 18 }//ST表 ,静态求区间值
二维ST表 f[i][j][ii][jj]表示从i,j点开始长度为2^ii,2^jj的区间值
1 int f[N][N][40][40]; 2 int main(){ 3 int n,m; 4 cin>>n>>m; 5 for(int i=1;i<=n;++i){ 6 for(int j=1;j<=m;++j){ 7 cin>>f[i][j][0][0]; 8 } 9 } 10 for(int l=0;l<=log2(m);++l){ 11 for(int k=0;k<=log2(n);++k){ 12 if(l+k==0) 13 continue; 14 for(int i=1;i+(1<<k)<=n;++i){ 15 for(int j=1;j+(1<<l)<=m;++j){ 16 if(l!=0) 17 f[i][j][l][k]=max(f[i][j][l-1][k],f[i+(1<<(l-1))][j][l-1][k]); 18 else 19 f[i][j][l][k]=max(f[i][j][l][k-1],f[i][j+(1<<(k-1))][l][k-1]); 20 } 21 } 22 } 23 } 24 int x1,x2,y1,y2; 25 cin>>x1>>y1>>x2>>y2; 26 int j=log2(x2-x1+1); 27 int k=log2(y2-y1+1); 28 int ans=max(f[x1][y1][j][k],f[x1][y2-(1<<k)+1][j][k]); 29 ans=max(ans,f[x2-(1<<j)+1][y1][j][k]); 30 ans=max(ans,f[x2-(1<<j)+1][y2-(1<<k)+1][j][k]); 31 cout<<ans<<endl; 32 return 0; 33 }//二维ST表
bellman求最短路(一般可以判断图是否有负环,循环超过n-1次就有负环)
1 int first[N]; 2 struct Edge{ 3 int to; 4 int next; 5 int w; 6 }edge[N]; 7 int cnt=0; 8 void add(int u,int v,int w){ 9 edge[++cnt].to=v; 10 edge[cnt].w=w; 11 edge[cnt].next=first[u]; 12 first[u]=cnt; 13 } 14 int dis[N]; 15 int main(){ 16 ioscin; 17 int n,m,s; 18 cin>>n>>m>>s; 19 memset(dis,127,sizeof(dis)); 20 dis[s]=0; 21 while(m--){ 22 int u,v,w; 23 cin>>u>>v>>w; 24 add(u,v,w); 25 } 26 while(1){ 27 int num=0; 28 for(int i=1;i<=n;++i){ 29 if(dis[i]<(1<<30)){ 30 for(int j=first[i];j!=0;j=edge[j].next){ 31 if(dis[edge[j].to]>dis[i]+edge[j].w){ 32 num++; 33 dis[edge[j].to]=dis[i]+edge[j].w; 34 } 35 } 36 } 37 } 38 if(num==0){ 39 break; 40 } 41 } 42 for(int i=1;i<=n;++i){ 43 cout<<dis[i]<<' '; 44 } 45 return 0; 46 }//bellman求最短路
drjkstra求最短路,一般用优化后的版本,没优化很慢
1 int first[N]; 2 struct Edge{ 3 int to; 4 int next; 5 int w; 6 }edge[N]; 7 int cnt=0; 8 void add(int u,int v,int w){ 9 edge[++cnt].to=v; 10 edge[cnt].w=w; 11 edge[cnt].next=first[u]; 12 first[u]=cnt; 13 } 14 int dis[N]; 15 int n,m,s; 16 set<pii>q;//set替代堆 17 void dijkstra(int s){ 18 memset(dis,127,sizeof(dis));20 dis[s]=0; 21 for(int i=1;i<=n;++i){ 22 q.insert(mp(dis[i],i)); 23 } 24 while(!q.empty()){ 25 int x=q.begin()->second; 26 if(dis[x]>(1<<30)){ 27 break; 28 } 29 q.erase(q.begin()); 30 for(int i=first[x];i!=0;i=edge[i].next){ 31 if(dis[edge[i].to]>dis[x]+edge[i].w){ 32 q.erase(mp(dis[edge[i].to],edge[i].to)); 33 dis[edge[i].to]=dis[x]+edge[i].w; 34 q.insert(mp(dis[edge[i].to],edge[i].to)); 35 } 36 } 37 } 38 } 39 int main(){ 40 cin>>n>>m>>s; 41 while(m--){ 42 int u,v,w; 43 cin>>u>>v>>w; 44 add(u,v,w); 45 } 46 dijkstra(s); 47 for(int i=1;i<=n;++i){ 48 cout<<dis[i]<<' '; 49 } 50 return 0; 51 }//dijkstra堆优化
浙公网安备 33010602011771号