题目链接


Solution

分块+\(Dijkstra\).

难点在于建边,很明显 \(O(n^2)\) 建边会挂一堆 .

那么考虑一下, \(n^2\) 建边多余的是哪些东西 \(???\)

很显然是冗杂的边,即两个点在之前已经可以互达了,但是在这一次仍然又连接一遍.

所以我们对于 \(n\) 个点都开 \(sqrt(n)\) 个辅助点.代表第 \(i\) 个点可以走出 \(j\) .

辅助点之间也需要与相邻的连上一条边权为 \(1\) 的边.

然后对于 \(m\) 个点分类讨论.

  • 如果 \(p_i<sqrt(n)\)

    那么在这 \(sqrt(n)\) 里面对应连边.

  • 如果 \(p_i>sqrt(n)\)

    那么很显然他所连向的边一般不会有冗杂(大概率).所以直接暴力连边即可.

然后最后面跑一遍 \(Diskstra\) 即可.

注意距离要开 \(long~long\).


Code

#include<bits/stdc++.h>
#define il inline
#define ll long long
#define rg register
#define num(x,y) x*n+y
using namespace std;
const int maxn=30008;
const int inf=0x3f3f3f3f; struct sj{int to,next; ll w;}a[maxn*500];
int n,m,head[maxn*105],size,s,t,tmp;
int b[maxn],p[maxn];ll dis[maxn*105];
il void add(int x,int y,ll w)
{
a[++size].to=y;
a[size].next=head[x];
head[x]=size;
a[size].w=w;
} il int read()
{
char ch=getchar();int f=1,w=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){w=w*10+ch-'0';ch=getchar();}
return f*w;
} struct node{int u; ll d;
bool operator <(const node& kkk)const
{return d>kkk.d;}
}; il void Dijkstra()
{
priority_queue<node>q;
memset(dis,127,sizeof(dis));
q.push((node){s,0});
dis[s]=0;
while(!q.empty())
{
node x=q.top();q.pop();
int u=x.u;
for(int i=head[u];i;i=a[i].next)
{
int tt=a[i].to;
if(dis[tt]>dis[u]+a[i].w)
{
dis[tt]=dis[u]+a[i].w;
q.push((node){tt,dis[tt]});
}
}
}
return;
} int main()
{
n=read();m=read();
for(int i=1;i<=m;i++) b[i]=read()+1,p[i]=read();
s=b[1];t=b[2];
tmp=min((int)sqrt(n),100);
for(int i=1;i<=tmp;i++)
for(int j=1;j<=n;j++)
add(num(i,j),j,0);
for(int i=1;i<=tmp;i++)
for(int j=1;j<=n-i;j++)
add(num(i,j),num(i,j+i),1),
add(num(i,j+i),num(i,j),1);
for(int i=1;i<=m;i++)
{
if (p[i]<=tmp) add(b[i],num(p[i],b[i]),0);
else
{
for(ll j=1;b[i]+j*p[i]<=n;j++) add(b[i],b[i]+j*p[i],j);
for(ll j=1;b[i]-j*p[i]>=1;j++) add(b[i],b[i]-j*p[i],j);
}
} Dijkstra();
cout<<(dis[t]>192608173?-1:dis[t])<<endl;
return 0;
}

最新文章

  1. Cropper – 简单的 jQuery 图片裁剪插件
  2. C#知识体系(一) --- 常用的LInq 与lambda表达式
  3. [转]Neural Networks, Manifolds, and Topology
  4. Java基础之线程——管理线程同步代码块(BankOperation4)
  5. android 关于InputDispatcher出现Consumer错误的解决办法
  6. Emeditor所有快捷键操作
  7. POJ_1065_Wooden_Sticks_(动态规划,LIS+鸽笼原理)
  8. java实战之数组工具集
  9. android入门——Service
  10. 《JS权威指南学习总结--8.6 函数闭包》
  11. R语言安装加载包
  12. .NET Core阿里大于短信发送SDK修改以及使用
  13. 不看就亏了:DELL EqualLogic PS6100详解及数据恢办法
  14. 吴恩达深度学习第2课第3周编程作业 的坑(Tensorflow+Tutorial)
  15. 实现DataTables搜索框查询结果高亮显示
  16. idea的mybatis的mysql语句的小数转换百分号
  17. maven install报错 Failed to execute goal on project my-manager-mapper: Could not resolve dependencies for project com.my:my-manager-mapper:jar:0.0.1-SNAPSHOT:
  18. JAVA SFTP文件上传、下载及批量下载
  19. simple简单消息队列
  20. SNF快速开发平台MVC-EasyUI3.9之-WebApi和MVC-controller层接收的json字符串的取值方法和调用后台服务方法

热门文章

  1. Java 可变长参数列表
  2. java基础—代理(proxy)
  3. c++调用系统关机命令 c++调用暂停命令
  4. retain, copy, assign以及autorelease
  5. 经常用到的js函数
  6. [BZOJ] 4145: [AMPPZ2014]The Prices
  7. centos里没有pip命令怎么办?
  8. 前端MVVM模式及其在Vue和React中的体现
  9. crond定时操作 crontab
  10. Down the Pyramid