【bzoj4070】[Apio2015]雅加达的摩天楼 分块+最短路
来源:互联网 发布:c语言获取系统日期 编辑:程序博客网 时间:2024/04/27 15:53
我们发现每次加入的边模p的余数是相同的,很容易想到对p分块
当p>sqrt(n)时,最多会连出O(sqrt(n))条边,直接连边即可
当p<=sqrt(n)时,
把图分成sqrt(n)+1层,最底层表示原来的节点
从下往上依次表示p=1、2、3……时的节点
对于每个p,把模p的余数相同的点顺次连接
对于每个读入的p,从最底层向对应的第p层的节点连一条权值为0的边即可
据说spfa快?
还算是道不错的题
当p>sqrt(n)时,最多会连出O(sqrt(n))条边,直接连边即可
当p<=sqrt(n)时,
把图分成sqrt(n)+1层,最底层表示原来的节点
从下往上依次表示p=1、2、3……时的节点
对于每个p,把模p的余数相同的点顺次连接
对于每个读入的p,从最底层向对应的第p层的节点连一条权值为0的边即可
据说spfa快?
还算是道不错的题
O(3*n*sqrt(n)+2*num*sqrt(n)+(m-num))
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#define maxn 30010#define N 15000010#define inf 1000000000using namespace std;int head[110*maxn],to[N],len[N],next[N],dis[110*maxn];bool vis[110*maxn];int pos[110][maxn],q[110*maxn];int n,m,num,block,cnt,s,t;void addedge(int x,int y,int z){num++;to[num]=y;len[num]=z;next[num]=head[x];head[x]=num;}void spfa(){for (int i=0;i<=cnt;i++) dis[i]=inf;int l=0,r=1;q[1]=s;vis[s]=1;dis[s]=0;while (l!=r){l++;if (l==110*maxn) l=0;int x=q[l];for (int p=head[x];p;p=next[p]) if (dis[x]+len[p]<dis[to[p]]) { dis[to[p]]=dis[x]+len[p]; if (!vis[to[p]]) { r++;if (r==110*maxn) r=0; vis[to[p]]=1;q[r]=to[p]; } }vis[x]=0;}}int main(){scanf("%d%d",&n,&m);cnt=n-1;block=min((int)sqrt(n),100);for (int i=1;i<=block;i++) for (int j=0;j<i;j++) for (int k=j;k<n;k+=i) { pos[i][k]=++cnt; addedge(cnt,k,0); if (k>=i) addedge(cnt-1,cnt,1),addedge(cnt,cnt-1,1); }for (int i=1;i<=m;i++){int B,p;scanf("%d%d",&B,&p);if (i==1) s=B;if (i==2) t=B;if (p<=block) addedge(B,pos[p][B],0);else{for (int j=1;B+j*p<n;j++) addedge(B,B+j*p,j);for (int j=1;B-j*p>=0;j++) addedge(B,B-j*p,j);}}spfa();if (dis[t]!=inf) printf("%d\n",dis[t]); else printf("-1\n");return 0;}
0 0
- 【bzoj4070】[Apio2015]雅加达的摩天楼 分块+最短路
- 【bzoj4070】【APIO2015】【雅加达的摩天楼】【最短路】
- bzoj4070【APIO2015】雅加达的摩天楼
- BZOJ4070: [Apio2015]雅加达的摩天楼
- BZOJ4070: [Apio2015]雅加达的摩天楼
- bzoj 4070: [Apio2015]雅加达的摩天楼 最短路+分块
- [SPFA 分块建图] BZOJ 4070 [Apio2015]雅加达的摩天楼
- 4070: [Apio2015]雅加达的摩天楼
- 【BZOJ 4070】 [Apio2015]雅加达的摩天楼
- bzoj 4070: [Apio2015]雅加达的摩天楼
- UOJ 111 & BZOJ 4070 [Apio2015]雅加达的摩天楼
- APIO2015 Bali Sculptures UOJ111 BZOJ4070
- [APIO] [最短路] [UOJ#111] APIO2015 Jakarta Skyscrapers
- 雅加达的晨光
- 摩天楼
- 摩天楼
- 【最短路】最短路上的统计
- 【最短路】poj3660 最短路的应用
- Javascript 面向对象编程(一):封装
- 顺时针旋转矩阵
- 需要事先使用 ApiConfigKit.setThreadLocalApiConfig(apiConfig) 将 ApiConfig对象存入,才可以调用 ApiConfigKit.getApiConf
- C++ 复制构造和赋值的区别
- 热电堆
- 【bzoj4070】[Apio2015]雅加达的摩天楼 分块+最短路
- SyncThread用法
- 【Android】15、活动的生命周期
- Navicat 11.2最新功能,你都get了吗?
- 面向对象的进一步拓展
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- 006.子类和父类的加载顺序
- 查找算法
- JQuery侧边栏实现