题解

事实上是个分块暴力

就是跳跃长度大于\(\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 ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}

【LOJ】#2887. 「APIO2015」雅加达的摩天楼 Jakarta Skyscrapers的更多相关文章

  1. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  2. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  3. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  4. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

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

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  6. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  7. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

  8. Loj #3055. 「HNOI2019」JOJO

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

  9. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

随机推荐

  1. 【刷题】BZOJ 4176 Lucas的数论

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

  2. 【刷题】BZOJ 3724 PA2014Final Krolestwo

    Description 你有一个无向连通图,边的总数为偶数. 设图中有k个奇点(度数为奇数的点),你需要把它们配成k/2个点对(显然k被2整除).对于每个点对(u,v),你需要用一条长度为偶数(假设每 ...

  3. BZOJ 3609: [Heoi2014]人人尽说江南好

    3609: [Heoi2014]人人尽说江南好 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 470  Solved: 336[Submit][Sta ...

  4. NOIP2018备考——DP专题练习

    P4095 [HEOI2013]Eden 的新背包问题   P2657 [SCOI2009]windy数   P3413 SAC#1 - 萌数   P3205 [HNOI2010]合唱队   P476 ...

  5. C语言复习---杨辉三角打印

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math ...

  6. Redis实战(八)Redis的配置文件介绍

    https://www.cnblogs.com/ysocean/p/9074787.html

  7. java代码实现图片处理功能。对图片质量进行压缩。

    java图片处理有点头疼,找了很多资料.在这里进行一个汇总,记录下个人的体验,也希望对大家有所帮助. 需求:浏览的图片需要在1M一下. 1.真正对图片的质量进行压缩的(不是通过修改图片的高,宽进行缩小 ...

  8. 第13月第12天 Constraints priority

    1.Constraints priority 将evInputView的高度约束的priority设为750,evInputView的inputTextView如果不设高度约束,那么高度就是defau ...

  9. Android学习笔记——从源码看Handler的处理机制

    可能是出于性能的考虑,Android的UI操作是非线程安全的. 也就是说,如果你在一个新开的线程中直接操作UI是会引发异常的. 但是,Android又规定,不要去阻塞UI线程!否则,轻者引起程序卡顿, ...

  10. 搭建RabbitMQ集群(通用)

    RabbitMQ在Erlang node(节点)上 Erlang天生具有集群特性,非常好搭建集群,每一个节点(node)上具有一个叫erlang.Cookie的东西,也是一个标识符,可以互认. 1). ...