I-Just Jump_2019牛客暑期多校训练营(第八场)
题目链接
题意
有L+1个点,初始在第0个点上,要跳到第L个点,每次至少跳d格,也就是在点x至少要跳到x+d,且有m个限制
\((t_i, p_i)\)指跳第\(t_i\)次不能跳到\(p_i\)上
题解
设dp[i]表示从0跳到i且没有限制的方案数,可以预处理。对限制按t从小到大排序,\(g[i][0]\)表示通过了前i-1个限制,踩在了第i个限制上且1-i这些限制踩了偶数个,\(g[i][1]\)表示踩了奇数个限制的方案数,可以\(m^2\)递推,根据容斥原理加上踩偶次的方案数扣掉踩奇数次的方案数。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx = 1e7+5;
const int mod = 998244353;
ll dp[mx], fac[mx], invf[mx];
int g[3005][2];
int L, d, m;
int pow_mod(ll a, ll b) {
ll ans = 1;
while (b > 0) {
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b /= 2;
}
return ans;
}
struct Node {
int t, p;
bool operator < (Node other) const {
return t < other.t;
}
}node[3005];
int C(int x, int y) {
if (x < y || y < 0 || x < 0) return 0;
return (1LL * fac[x] * invf[y] % mod * invf[x-y]) % mod;
}
int calc(int i, int j) {
if (1LL * (node[j].t-node[i].t)*d > node[j].p-node[i].p) return 0;
return C(node[j].p-node[i].p-(node[j].t-node[i].t)*d + (node[j].t-node[i].t) - 1, node[j].t-node[i].t-1);
}
int main() {
scanf("%d%d%d", &L, &d, &m);
for (int i = 1; i <= m; i++) scanf("%d%d", &node[i].t, &node[i].p);
sort(node+1, node+1+m);
node[0].t = node[0].p = 0;
dp[0] = 1;
int sum = 0;
for (int i = 1; i <= L; i++) {
if (i-d >= 0) sum = (sum + dp[i-d]) % mod;
dp[i] = sum;
}
fac[0] = invf[0] = 1;
for (int i = 1; i <= L; i++) fac[i] = 1LL * fac[i-1] * i % mod;
invf[L] = pow_mod(fac[L], mod-2);
for (int i = L-1; i >= 1; i--) invf[i] = 1LL * invf[i+1] * (i+1) % mod;
g[0][0] = 1; g[0][1] = 0;
for (int i = 1; i <= m; i++) {
for (int j = 0; j < i; j++) {
g[i][0] = (g[i][0] + 1LL * g[j][1] * calc(j, i) % mod) % mod;
g[i][1] = (g[i][1] + 1LL * g[j][0] * calc(j, i) % mod) % mod;
}
}
ll ans = dp[L];
for (int i = 1; i <= m; i++) {
ans += 1LL * (g[i][0] - g[i][1]) * dp[L-node[i].p] % mod;
ans = (ans % mod + mod) % mod;
}
printf("%lld\n", ans);
return 0;
}
I-Just Jump_2019牛客暑期多校训练营(第八场)的更多相关文章
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 2019牛客暑期多校训练营(第二场)J-Subarray(思维)
>传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...
- J-Subarray_2019牛客暑期多校训练营(第二场)
题意 有一个只由1,-1组成的数组,给出所有连续的1所在位置,求满足1的个数大于-1的个数的子区间的数量 题解 参考博客:https://www.cnblogs.com/Yinku/p/1122149 ...
随机推荐
- NLP(十二)依存句法分析的可视化及图分析
依存句法分析的效果虽然没有像分词.NER的效果来的好,但也有其使用价值,在日常的工作中,我们免不了要和其打交道.笔者这几天一直在想如何分析依存句法分析的结果,一个重要的方面便是其可视化和它的图分析 ...
- 在 Windows 上搭建 PHP 网站
PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用.PHP的语法借鉴吸收C语言. ...
- RobotFramework_1.简介和安装
RobotFramework_1.简介与安装 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bot ...
- Android Studio 蓝牙开发实例——基于Android 6.0
因项目需要做一个Android 的蓝牙app来通过手机蓝牙传输数据以及控制飞行器,在此,我对这段时间里写的蓝牙app的代码进行知识梳理和出现错误的总结. 该应用的Compile Sdk Version ...
- 一个C++的ElasticSearch Client
ElasticSearch官方是没有提供C++的client的:因此决定自己写一个,命名为ESClient https://github.com/ATinyAnt/ESClient(手下留星 star ...
- web渗透---第一天
了解黑客 黑客: 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现, 灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是 出现了“骇客”与黑客”分家. 黑客:Hacker 骇 ...
- node 删除和复制文件或文件夹
[toc] 创建时间:2019-08-12 注意:在win10,v10.16.1 环境运行无问题 首先引入相关包(会在使用处具体说明): const fs = require('fs') const ...
- 每个程序员都可以「懂」一点 Linux
提到 Linux,作为程序员来说一定都不陌生.但如果说到「懂」Linux,可能就没有那么多人有把握了.到底用 Linux 离懂 Linux 有多远?如果决定学习 Linux,应该怎么开始?要学到什么程 ...
- 鲜为人知的maven标签解说
目录 localRepository interactiveMode offline pluginGroups proxies servers mirrors profiles 使用场景 出现位置 激 ...
- 手写Struts,带你深入源码中心解析
个人剖析,不喜勿喷 扫码关注公众号,不定期更新干活 在此申明本博文并非原创,原文:http://blog.csdn.net/lenotang/article/details/3336623,本文章是在 ...