Frog Jumping

题目链接http://codeforces.com/contest/1146/problem/D

数据范围:略。


题解

首先发现,如果$x\ge a +b$,那么所有的$Num | gcd(a,b)$都可以取到。

这是显然的因为我们可以保证最右端点在$a+b$内。

那么我们只需要考虑小于$x$的部分。

可以暴力建边,跑出当前点需要的最右端点的最小值,用spfa或者堆优化dij都行。

代码

#include <bits/stdc++.h>

#define N 1000010 

using namespace std;

typedef long long ll;

int tag[N];

int head[N], to[N << 1], nxt[N << 1], tot;

inline void add(int x, int y) {
to[ ++ tot] = y;
nxt[tot] = head[x];
head[x] = tot;
} int dis[N]; bool vis[N]; queue <int> q; void spfa(int a, int b) {
memset(dis, 0x3f, sizeof dis);
dis[0] = 0;
q.push(0);
vis[0] = 1;
while (!q.empty()) {
int x = q.front();
vis[x] = false;
q.pop();
int pre = x - b, aft = x + a;
if (pre >= 0 && max(dis[x], pre) < dis[pre]) {
dis[pre] = max(dis[x], pre);
if (!vis[pre]) {
q.push(pre);
vis[pre] = true;
}
}
if (aft <= a + b && max(dis[x], aft) < dis[aft]) {
dis[aft] = max(dis[x], aft);
if (!vis[aft]) {
q.push(aft);
vis[aft] = true;
}
}
}
} int f[N]; int main() {
int x, a, b;
cin >> x >> a >> b ;
spfa(a, b);
// puts("Fuck");
int d = __gcd(a, b);
if (x <= a + b) {
for (int i = 0; i <= x; i += d) {
if (dis[i] != 0x3f3f3f3f) {
tag[dis[i]] ++ ;
}
}
for (int i = 1; i <= x; i ++ ) {
tag[i] += tag[i - 1];
}
long long ans = 0;
for (int i = 0; i <= x; i ++ ) {
ans += tag[i];
}
cout << ans << endl ;
return 0;
}
// puts("A");
for (int i = 0; i <= a + b; i += d) {
// printf("%d\n", dis[i]);
if (dis[i] != 0x3f3f3f3f) {
tag[dis[i]] ++ ;
}
}
// puts("B");
for (int i = 1; i <= a + b; i ++ ) {
tag[i] += tag[i - 1];
}
// puts("C");
ll ans = 0;
for (int i = 0; i <= a + b; i ++ ) {
ans += tag[i];
}
// cout << ans << endl ;
int id = 0;
for (int i = a + b + 1; i <= x; i ++ ) {
if (i % d == 0) {
id = i;
break;
}
ans += i / d + 1;
// cout << ans << endl ;
}
if (!id) {
cout << ans << endl ;
return 0;
}
// cout << id << endl ;
int bg = id / d, ed = x / d;
ans += (ll)(bg + ed + 1) * (ed - bg) / 2 * d;
ans += (ll)(x - (ll)ed * d + 1) * (ed + 1);
cout << ans << endl ;
return 0;
}

[CF1146D]Frog Jumping_exgcd_堆优化dij的更多相关文章

  1. B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij

    B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...

  2. [CF1209F]Koala and Notebook_堆优化dij

    Koala and Notebook 题目链接:https://codeforces.com/contest/1209/problem/F 数据范围:略. 题解: 开始的时候看错题了....莫名其妙多 ...

  3. 【洛谷P1462】【二分+堆优化dij】

    题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 每次经过一个城市,都会被收取 ...

  4. 【模板】堆优化 + dij +pair 存储

    就是短 感谢Cptraserdalao的博客 #include<bits/stdc++.h> using namespace std; struct node { int val,num; ...

  5. 链式前向星实现的堆优化dij求最短路模板

    #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...

  6. 堆优化dij

    #include<iostream> #include<cstdio> #include<queue> using namespace std; ],head[], ...

  7. 2017多校第9场 HDU 6166 Senior Pan 堆优化Dij

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值. 解法:枚举二进制位 ...

  8. [CF1005F]Berland and the Shortest Paths_最短路树_堆优化dij

    Berland and the Shortest Paths 题目链接:https://www.codeforces.com/contest/1005/problem/F 数据范围:略. 题解: 太鬼 ...

  9. dij+堆优化

    写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个: 香甜的奶油: #include<iostream> #include<cstdio> #include<cs ...

随机推荐

  1. 【题解】P3069 [USACO13JAN]牛的阵容Cow Lineup-C++

    题目传送门 思路这道题目可以通过尺取法来完成 (我才不管什么必须用队列)什么是尺取法呢?顾名思义,像尺子一样取一段,借用挑战书上面的话说,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后 ...

  2. PHP mysqli_commit() 函数

    关闭自动提交,做一些查询,然后提交查询: <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("localh ...

  3. Web应用运行原理

    web应用启动做了什么? 读取web.xml文件   - web.xml常用配置参数: 1).context-param(上下文参数)2).listener(监听器配置参数)3).filter(过滤器 ...

  4. java+web+多级文件上传

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  5. 线程的分离状态 detached joinable

    转自  http://blog.chinaunix.net/uid-26983585-id-3315953.html 其实在写上一篇日志的时候,由于我把创建线程的返回值的判断条件写错了,程序每次运行的 ...

  6. sigprocmask , sigpending 和 sigsuspend函数

    转自 http://blog.csdn.net/elbort/article/details/7594772 sigprocmask函数:功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞). ...

  7. 提交项目到Github

    create a new repository on the command line git init git add README.md git commit -m "first com ...

  8. 两大主流开源分布式存储的对比:GlusterFS vs. Ceph

    两大主流开源分布式存储的对比:GlusterFS vs. Ceph 存储世界最近发生了很大变化.十年前,光纤通道SAN管理器是企业存储的绝对标准,但现在的存储必须足够敏捷,才能适应在新的基础架构即服务 ...

  9. Tecplot中如何计算Ma数(马赫数)【转载】

    转载自:http://blog.163.com/wanglei2146073@126/blog/static/90689607201282555055144/ fluent是我们常用的CFD软件,但由 ...

  10. Kafka - SASL认证

    kafka SASL认证配置 1.找到kafka安装根目录,在config文件夹下创建kafka_server_jaas.conf,写入 KafkaServer { org.apache.kafka. ...