[USACO19JAN,Platinum]Train Tracking 2

虽然是简单的dp ,but真的太难想到了,而且我的码力。。。

Train Tracking 2

【题目描述】
每天特快列车都会经过农场。列车有N节车厢(1≤N≤105),每节车厢上有一个1到109之间的正整数编号;不同的车厢可能会有相同的编号。 平时,Bessie会观察驶过的列车,记录车厢的编号。但是今天雾实在太浓了,Bessie一个编号也看不见!幸运的是,她从城市里某个可靠的信息源获知了列车编号序列的所有滑动窗口中的最小值。具体地说,她得到了一个正整数K,以及N−K+1个正整数c1,…,cN+1−K,其中ci是车厢i,i+1,…,i+K−1之中编号的最小值。

帮助Bessie求出满足所有滑动窗口最小值的对每节车厢进行编号的方法数量。由于这个数字可能非常大,只要你求出这个数字对10^9+7取余的结果Bessie就满意了。

Bessie的消息是完全可靠的;也就是说,保证存在至少一种符合要求的编号方式。

【输入输出格式】
输入的第一行包含两个空格分隔的整数N和K。余下的行包含所有的滑动窗口最小值c1,…,cN+1−K,每行一个数。

输出一个整数:对每节车厢给予一个不超过109的正整数编号的方法数量对10^9+7取余的结果,满足车厢i,i+1,…,i+K−1之中编号的最小值等于ci,对于1≤i≤N−K+1均成立。

【输入输出样例】
输入
4 2
999999998
999999999
999999998
输出
3
【分析】
1:999999998 999999999 999999999 999999998
2:999999998 999999999 1000000000 999999998
3:999999998 1000000000 999999999 999999998

【解题思路】
首先你嘚想到相邻的i,ji,jij如果它们的最小值不一样,那么一定可以固定一个点

eg:iiii+k−1i+k-1i+k1的最小值4,j4,j4,jj+k−1j+k-1j+k1的最小值333iii小于jjj,即j=i+1j=i+1j=i+1,这个时候就固定了j+k−1j+k-1j+k1得是333

从中我们的启发是什么

把c值相同的连续区间单独拎出来

ci=ci+1=ci+2=...=cj=vci=ci+1=ci+2=...=cj=vci=ci+1=ci+2=...=cj=v

这一段代表的区间总长为j−i+kj−i+kji+k,证明一下:iiijjj区间长为j−i+1j-i+1ji+1没问题

那么jjj包含的区间长是kkk,加在一起再减去一个重复的jjj就是j−i+kj-i+kji+k,继续

所有的数都大于等于vvv,同时每kkk个中就有至少一个vvv

有一个直接的dp:设dp[i]dp[i]dp[i]表示最后一个vvviii位置时的合法方案数,ppp1e9−v1e9−v1e9v

那么有转移dp[i]=∑(j=i−k,i−1)pi−j−1∗f[j]dp[i]=∑( j=i−k, i−1)p^i−j−1*f[j]dp[i]=j=iki1pij1f[j]

这样是O(nk)O(nk)O(nk)的,会TLE

稍微改变一下错位相消就变成了:

dp[i]=(p+1)*f[i−1]−p^k∗f[i−k−1]

在这里要解释一下首先如果有最小值是xxx,那么方案数就是(1e9−x+1)j−i+1(1e9-x+1)^{j-i+1}(1e9x+1)ji+1减去不合法的方案数

[i,j][i,j][ij]区间不合法的方案数其实是所有取值全都大于了vvv,没有一个是vvv,其实也就是(1e9−x+1)j−i+1(1e9-x+1)^{j-i+1}(1e9x+1)ji+1

问题是为什么要乘以dp[i−k−1]dp[i-k-1]dp[ik1]呢?

你想想在iii不合法的方案数,在i−1i-1i1时是属于合法的方案数,所以影响iii的是i−k−1i-k-1ik1的所有方案
因为从i−k−1i-k-1ik1开始往前不管选什么都与iii无关,所以后面是不合法的,前面不管合不合法都算不合法,所以要相乘

接着就是考虑如何处理两个vvv不一样的交界处
说白了就是两个vvv谁更大,相交的部分就交给谁处理在这里插入图片描述
因为这就好比不等式解集的取法,如果这个香蕉区间既要满足最小值为5又要满足最小值为6那坑定是选满足最小值为6啊!

如果处理到iii时,iii有一部分区间被前面处理过,那么就要减去kkk

因为我们是循环iii是每次只加111所以当最小值不一样的时候,两个区间的香蕉部分就是k−1k-1k1,又因为这k−1k-1k1被前面处理过,也就意味着iii这个点为了满足最小值也是固定的,那么真正波动的有选择的长度就减去了kkk

同理如果处理到iii时,发现i+1i+1i+1的最小值更大,也就意味着有k−1k-1k1区间是后面处理,i也固定下来了。长度便又减去了kkk

最后就是注意头i=1i=1i=1和尾i=n−k+1i=n-k+1i=nk+1时的特判,如果i=1i=1i=1它就不能进行把k−1k-1k1区间交给前面的人处理,因为它前面没人;如果i=n−k+1i=n-k+1i=nk+1它就不能进行把k−1k-1k1区间交给后面的人处理,因为它后面也没人了。
在这里插入图片描述
在这里,要重点解释一下下面代码的dp初值设定,早上吃饭时突然灵机乍现,明白这样写的原因

为什么?dp[0]和dp[1]初值是1 为什么?window里i循环要从2开始
1)dp[0]的情况,就是这一段区间刚好就是1~k,
那么当我们算到dp[k]的时候,它是包含了从1~k所有都取大于min的值的不合法的方案数
而我们要减掉这些不合法的方案数,也就是每一个数的取值都是min+1~1e9,有k个
所以不合法方案数就是(1e9-(min-1)+1)^k也就是代码中的tp,
那么这个系数是由dp[0]来提供,因而要赋值成1

2)dp[1]的情况,就是这一段区间刚好是1~k+1
而我们能进入这个函数一定要满足这个区间所有数的最小值是一样的val
所以当我们算到dp[k+1]的时候
不合法的方案数=2~k全都不是最小值方案数*dp[1]的方案数
那dp[1]不应该是tp吗?
no~~因为我们的通向dp式dp[i-k-1]是乘以(1e9-min)的K次方,而2到k全都不是最小值方案数是(1e9-min)的K-1次方,dp[1]的所有方案数是(1e9-min)相乘刚好就是k次方
那么这时候的系数又是由dp[1]提供的,就只能赋值成1

同样这也是为什么我们的i是从2开始循环,为了考虑这两种情况就要给0,1腾位置,

【代码实现】

#include <cstdio>
const int mod = 1e9 + 7;
const int p = 1e9;
#define MAXN 100005
#define LL long long
int n, k;
LL c[MAXN];
LL result = 1;
LL dp[MAXN];LL qkpow ( LL x, LL y ) {LL res = 1;while ( y ) {if ( y % 2 ) res = ( res * x ) % mod;x = ( x * x ) % mod;y >>= 1;}return res % mod;
}LL window ( LL val, LL len ) {LL tmp = p - val;LL tp = qkpow ( tmp, k );dp[0] = dp[1] = 1;for ( int i = 2;i <= len + 1;i ++ ) {dp[i] = ( ( tmp + 1 ) * dp[i - 1] ) % mod;if ( i - k - 1 >= 0 ) dp[i] = ( ( dp[i] - ( ( tp * dp[i - k - 1] ) % mod ) + mod ) % mod ) % mod;}return dp[len + 1] % mod;
}int main() {scanf ( "%d %d", &n, &k );for ( int i = 1;i <= n - k + 1;i ++ )scanf ( "%lld", &c[i] );for ( int i = 1, j;i <= n - k + 1;i = j + 1 ) {LL len;j = i;while ( c[i] == c[j + 1] )j ++;len = j - i + k;if ( i != 1 && c[i - 1] > c[i] )len -= k;if ( j != n - k + 1 && c[j + 1] > c[i] )len -= k;if ( len > 0 )result = ( result * window ( c[i], len ) ) % mod;}printf ( "%lld", result % mod );return 0;
} 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻重链剖分

重链剖分 P3384 【模板】轻重链剖分/树链剖分 $ / $ 模板代码&#xff1a; 注意&#xff1a; 如果有 \(0\) 号节点&#xff0c;并默认重儿子是零号节点&#xff0c;复杂度会退化为 \(O(n^2)\) 。原因&#xff1a; 代码第一次遍历默认重儿子是0&#xff0c;所以无法保证每次找到…

CF19E-Fairy【树形结构,差分】

正题 题目链接:https://www.luogu.com.cn/problem/CF19E 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;求有多少条边去掉后可以使得图变成一张二分图。 1≤n,m≤1041\leq n,m\leq 10^41≤n,m≤104 解题思路 虽然线段树分治可以暴力草过去但是考虑点智慧的做法。 众…

.netcore 堆栈调用方法小记

1|0背景上午临近午饭时&#xff0c;公司同事反馈验证码被攻击灌水。我们匆忙查询验证码明细&#xff0c;对已频繁出现的IP插入黑名单&#xff0c;但IP仍然隔断时间频繁变动&#xff0c;不得已之下只能先封禁对应公司id的验证码发送功能。年初时候&#xff0c;专门对SSO站点的发…

洛谷P2480:古代猪文(中国剩余定理)(欧拉定理)

传送门 文章目录题目描述解析总结代码题目描述 解析 简单来说&#xff0c;就是求&#xff1a; g∑C(d,n)(d是n的约数&#xff09;mod 999911659 可以先特判一下&#xff0c;999911659|g时&#xff0c;答案为0 否则&#xff0c;可以通过欧拉定理转化为&#xff1a; g∑C(d,n)(d…

Stone Game

题意&#xff1a; 有n堆石头&#xff0c;每堆石头最多只有三个石头&#xff08;最少1个&#xff09;&#xff0c;每两堆石头&#xff08;这两堆各含石头x个和y个&#xff09;合一起的费用为(x mod 3) * (y mod 3)&#xff0c;现在把所有堆合成一堆&#xff0c;问最小费用 题目…

杯子 + Kronican

杯子 Kronican 【题目描述】 重庆八中在80周年校庆的时候获捐n个杯子&#xff0c; 每个杯子有两个属性&#xff1a;一个是已装水量 ai&#xff0c;一个是可装水量 bi&#xff08;ai < bi&#xff09;。 从一个杯子向另一个杯子倒 x 单位体积的水需要花费的时间是 x 秒。 现…

【做题记录】 [HEOI2013]SAO

P4099 [HEOI2013]SAO 类型&#xff1a;树形 \(\text{DP}\) 这里主要补充一下 \(O(n^3)\) 的 \(\text{DP}\) 优化的过程&#xff0c;基础转移方程推导可以参考其他巨佬的博客(题解)。 令 \(f[x][p]\) 表示在以 \(x\) 为根的子树中&#xff0c;\(x\) 在拓扑序排在第 \(p\) 个时的…

CF25E-Test【AC自动机,bfs】

正题 题目链接:https://www.luogu.com.cn/problem/CF25E 题目大意 给出三个串&#xff0c;然后求一个最短的串包含这三个串。 1≤∣s1∣,∣s2∣,∣s3∣≤1051\leq |s_1|,|s_2|,|s_3|\leq 10^51≤∣s1​∣,∣s2​∣,∣s3​∣≤105 解题思路 把三个串状压&#xff0c;先跑出AC…

微软开源的Trill是什么?

以下是一篇15年的文章的译文&#xff1a;https://dwainegilmer.wordpress.com/2015/01/28/microsoft-trill-for-streaming-analytics-from-microsoft-research/当今许多大数据应用程序套件的重点是数据存储。它们是围绕狭窄范围的数据集设想和设计的&#xff0c;通常是为了组织…

剪纸游戏(博弈论)(SG函数)

文章目录题目描述解析题目描述 解析 本题的关键就是SG函数的定义 尝试了一些自己直观上可能对但题解没有使用的约定方法&#xff08;当然最后证明都是错的 。。。&#xff09;&#xff0c;对SG的理解更深刻了一些 SG0的含义是无法再移动换句话说也就是再移动也对败局于事无补&…

Fight against involution

题目&#xff1a; 对抗内卷&#xff08;大佬经常说别再卷了&#xff09; 有一门课程n个学生选&#xff0c;期末要写一篇论文每个同学写的字数有一个下限和一个上限&#xff0c;课程的成绩是按学生字数的排名来给分的&#xff0c;排名越高分数越高&#xff0c;每个同学都想得到…

【做题记录】 [JLOI2011]不等式组

P5482 [JLOI2011]不等式组 超烦人的细节题&#xff01;(本人调了两天 QAQ ) 这里介绍一种只用到一只树状数组的写法(离线)。 树状数组的下标是&#xff1a;所有可能出现的数据进行离散化之后的值。 其含义为&#xff1a;当 \(x\) 离散化后值为 \(i\) 时能满足的不等式个数为 \(…

[COCI2017-2018#5] Karte

[COCI2017-2018#5] Karte&#xff0c;简短的代码想到了就AC 这道题是SPJ放心搞 但是我的脑子里面的东西&#xff0c;不用我多说&#xff0c;你们就知道是水和面粉和成的 看招 题 【题目描述】 你有一副共有N张牌的牌&#xff0c;在第i张牌上会有一个数字ai表示在这张牌下面至…

YBTOJ:红与蓝(博弈论)

文章目录题目描述解析代码题目描述 解析 首先&#xff0c;这道题的情境对二人来说是不对称的&#xff0c;所以不太好使用SG函数来求解 但直观上也好考虑 利用树的递归性质可以求出每个节点的颜色是否确定 并确定根的颜色是否确定 如果确定是红就随便涂 确定是蓝就-1 关键在于不…

NWERC2020J-Joint Excavation【构造,贪心】

正题 题目链接:https://codeforces.com/gym/103049/problem/J 题目大意 nnn个点mmm条边的一张无向图&#xff0c;选出一条路径后去掉路径上的点&#xff0c;然后将剩下的点分成点数相等的两份使得两份之间没有边连接。 1≤n,m≤21051\leq n,m\leq 2\times 10^51≤n,m≤2105 解…

eShopOnContainers 看微服务④:Catalog Service

服务简介Catalog service&#xff08;目录服务&#xff09;维护着所有产品信息&#xff0c;包括库存、价格。所以该微服务的核心业务为&#xff1a;产品信息的维护库存的更新价格的维护架构模式先看代码结构&#xff08;下图&#xff09;。主要依赖&#xff1a;1、HealthCheck …

【CF 1195】Basketball Exercise/Submarine in the Rybinsk Sea (hard edition)/OpenStreetMap+二维单调队列滑动窗口模板

寡人认为C&#xff0c;E都是比较板的题 butD2也太ex了&#xff0c;大大是被那个mod精给弄疯了&#xff0c;我mod了那么多次还是炸了longlong orz 文章目录二维单调队列模板C&#xff1a;Basketball Exercise题目大意题解代码实现D2&#xff1a;Submarine in the Rybinsk Sea (…

Xor Transformation

题目&#xff1a; 给定一个X和Y&#xff0c;对于X每次可以选择一个A&#xff08;0<A<X&#xff09;&#xff0c;使得X X xor A&#xff0c;现在要求在5步内将X变为Y&#xff0c;请输出操作数目&#xff0c;以及每步的A 题解&#xff1a; 我一开始被题目给的样例个迷惑…

【做题记录】DP 杂题

P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心&#xff1a; 吃饭慢的先打饭节约时间&#xff0c; 所以先将人按吃饭时间从大到小排序。 状态&#xff1a; \(f[i][j]\) 表示前 \(i\) 个人&#xff0c;在 \(1号\) 窗口打饭总时间 \(j\) &#xff0c;最早吃完饭的时间。 我们…

YBTOJ:方程的解(组合数学)(插板法)

文章目录题目描述解析代码题目描述 解析 第一感觉&#xff1a;啥都没感觉出来。。。 直接拿动态规划高精做的 但是只能拿40 重新分析一下这道题&#xff1a; g&#xff08;x&#xff09;首先可以拿快速幂很容易的求出来 问题就转化为了**把g(x)个东西分成k份的方案数 其实答案…