题解

事实上是个分块暴力

就是跳跃长度大于\(\sqrt{n}\)的狗最多有\(\sqrt{n}\)个位置
剩下跳跃长度小于\(\sqrt{n}\)的暴力记录

也就是两个\(dis\)数组
\(dis[0][i][j]\)表示第\(i\)个位置有跳跃长度为\(j\)的狗
\(dis[1][i][j]\)表示第\(i\)只狗在自己的第\(j\)个位置上

然后遇到一个新的位置把这个位置上所有原有的狗全部扔进队列
之后BFS就行

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define mo 974711
#define MAXN 30005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) {x = -x;putchar('-');}if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
int dis[2][MAXN][205];
bool vis[MAXN][205],rec[MAXN];
vector<int> v[MAXN];
vector<int> dog[MAXN];
int M,N;
int B[MAXN],P[MAXN],st[MAXN];struct node {int a,b,c;
};
queue<node> Q;
void Process(int t,int d) {if(!rec[t]) {int s = dog[t].size();for(int i = 0 ; i < s ; ++i) {int h = dog[t][i];if(dis[1][h][st[h]] == -1) {dis[1][h][st[h]] = d;Q.push((node){1,h,st[h]});}}for(int i = 1 ; i < 200 ; ++i) {if(vis[t][i]) {if(dis[0][t][i] == -1) {dis[0][t][i] = d;Q.push((node){0,t,i});}}}rec[t] = 1;}
}
void BFS() {memset(dis,-1,sizeof(dis));if(P[0] < 200) {dis[0][B[0]][P[0]] = 0;Q.push((node){0,B[0],P[0]});}else {dis[1][0][st[0]] = 0;Q.push((node){1,0,st[0]});}Process(B[0],0);while(!Q.empty()) {node u = Q.front();Q.pop();int t;int d = dis[u.a][u.b][u.c];if(u.a == 0) {if(u.b + u.c < N) {if(dis[0][u.b + u.c][u.c] == -1) {dis[0][u.b + u.c][u.c] = d + 1;Q.push((node){0,u.b + u.c,u.c});Process(u.b + u.c,d + 1);}}if(u.b - u.c >= 0) {if(dis[0][u.b - u.c][u.c] == -1) {dis[0][u.b - u.c][u.c] = d + 1;Q.push((node){0,u.b - u.c,u.c});Process(u.b - u.c,d + 1);}}}else {if(u.c < v[u.b].size() - 1) {if(dis[1][u.b][u.c + 1] == -1) {dis[1][u.b][u.c + 1] = d + 1;Q.push((node){1,u.b,u.c + 1});Process(v[u.b][u.c + 1],d + 1);}}if(u.c > 0) {if(dis[1][u.b][u.c - 1] == -1) {dis[1][u.b][u.c - 1] = d + 1;Q.push((node){1,u.b,u.c - 1});Process(v[u.b][u.c - 1],d + 1);}}}}
}
void Init() {read(N);read(M);for(int i = 0 ; i < M ; ++i) {read(B[i]);read(P[i]);if(P[i] >= 200) {int k = B[i];dog[B[i]].pb(i);while(k >= P[i]) k -= P[i];while(k < N) {v[i].pb(k);if(k == B[i]) st[i] = v[i].size() - 1;k += P[i];}}else vis[B[i]][P[i]] = 1;}
}
void Solve() {BFS();int ans;if(P[1] >= 200) ans = dis[1][1][st[1]];else ans = dis[0][B[1]][P[1]];out(ans);enter;
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifInit();Solve();
}

转载于:https://www.cnblogs.com/ivorysi/p/10141246.html

【LOJ】#2887. 「APIO2015」雅加达的摩天楼 Jakarta Skyscrapers相关推荐

  1. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  2. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  3. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  4. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  5. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  6. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

  7. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  8. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

  9. Loj #2983. 「WC2019」数树

    Loj #2983. 「WC2019」数树 题目背景 白兔喜欢树. 白云喜欢数数. 有 \(n\) 只鼠,白兔用 \(n − 1\) 根蓝色绳子把它们连成了一棵树,每根蓝色绳子连着两只鼠,白云用 \( ...

最新文章

  1. 如何修改WINDOWS默认的3389远程端口
  2. python 使用sqlite3
  3. 电脑退出全屏按哪个键_电脑键盘上的F1到F12,每一个都是快捷键大家都会用到...
  4. 一直在构建版本_球鞋 | 一鞋两穿?AJ1十孔版本登场,拉链设计还是真香了?
  5. 粒子群算法实例-求解函数极值
  6. vue项目 预览照片的插件 v-viewer
  7. shell 中scp 和 ssh密码输入 --expect (转:http://blog.sina.com.cn/s/blog_8ad7d4ca01014lft.html)
  8. RS-485中继器的多种使用方法
  9. 通过Xshell登录远程服务器实时查看log日志
  10. java怎么获取中文首字母_Java如何获取中文拼音首字母的方法介绍
  11. CentOS7添加自定义系统服务
  12. CC创作共用版权协议,要求署名+非商业+相同方式共享
  13. 华为交换机配置时区_把华为交换机设置成时钟源服务器(NTP)
  14. 淘宝客推广赚钱全攻略
  15. c语言词法分析程序设计,c语言词法分析器的简单实现 词法分析器的设计与实现...
  16. windows获取CPU温度
  17. html5的header元素作用,html5header标签怎么用?html5header标签的作用介绍-
  18. android流光动画和流光字体
  19. Math三点共线判断
  20. 多智时代,大数据发展趋势预测

热门文章

  1. 程序猿的数学:scratch篇
  2. 36产生用户恶情绪和报复情绪的原因
  3. PHP请求一次网页前端浏览一次后端会出现两次请求次数的原因和解决方法。
  4. 微信小程序,小游戏sockect报错修复集合
  5. c语言程序命令行,ttyd(C语言编写的命令行程序) v1.3.1 免费版
  6. Java笔记-Integer或Long转String时补0(补零)
  7. 解决mysql ERROR 1045(28000)问题【忘记密码,修改配置文件,无密码登录mysql修改密码】
  8. Qt文档阅读笔记-QGraphicsEffect::draw(QPainter *painter)官方解析与实例
  9. Qt工作笔记-使用QCustomplot实现鼠标拖动数据点画曲线
  10. 计算机组成原理 北理,北京理工大学计算机组成原理期末复习.pdf