虽然是简单的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,ji,j如果它们的最小值不一样,那么一定可以固定一个点

eg:iii到i+k−1i+k-1i+k−1的最小值4,j4,j4,j到j+k−1j+k-1j+k−1的最小值333,iii小于jjj,即j=i+1j=i+1j=i+1,这个时候就固定了j+k−1j+k-1j+k−1得是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+kj−i+k,证明一下:iii到jjj区间长为j−i+1j-i+1j−i+1没问题

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

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

有一个直接的dp:设dp[i]dp[i]dp[i]表示最后一个vvv在iii位置时的合法方案数,ppp为1e9−v1e9−v1e9−v

那么有转移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=i−k,i−1)pi−j−1∗f[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}(1e9−x+1)j−i+1减去不合法的方案数

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

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

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

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

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

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

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

最后就是注意头i=1i=1i=1和尾i=n−k+1i=n-k+1i=n−k+1时的特判,如果i=1i=1i=1它就不能进行把k−1k-1k−1区间交给前面的人处理,因为它前面没人;如果i=n−k+1i=n-k+1i=n−k+1它就不能进行把k−1k-1k−1区间交给后面的人处理,因为它后面也没人了。

在这里,要重点解释一下下面代码的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;
}

[USACO19JAN,Platinum]Train Tracking 2相关推荐

  1. [USACO19JAN]Train Tracking 2——神仙结论题+DP

    原题链接 orz xzz巨佬 首先发现一个结论:两个相邻的\(c\)值如果不相同的话,就可以固定某个位置的值了 这启示我们把连续且相等的\(c\)给单独拿出来看,也就是对于一些\(c_i=c_{i+1 ...

  2. [USACO19JAN,Platinum] Redistricting

    [USACO19JAN,Platinum] Redistricting 这道题A了才知道..并不难a! orz 题目 内存限制:128 MiB 时间限制:1000 ms 题目描述 奶牛们的最大城市Bo ...

  3. [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构

    [源码解析] 模型并行分布式训练Megatron (2) - 整体架构 文章目录 [源码解析] 模型并行分布式训练Megatron (2) --- 整体架构 0x00 摘要 0x01 启动 1.1 分 ...

  4. ICCV 2017 UCT:《UCT: Learning Unified Convolutional Networks forReal-time Visual Tracking》论文笔记

    理解出错之处望不吝指正. 本文模型叫做UCT.就像论文题目一样,作者提出了一个基于卷积神经网络的end2end的tracking模型.模型的整体结构如下图所示(图中实线代表online trackin ...

  5. High Performance Visual Tracking with Siamese Region Proposal Network 论文学习

    文章目录 论文阅读总结 Translation Abstract 1 Introduction 2 Related Works 2.1 Trackers based on Siamese networ ...

  6. JDE(Towards Real-Time Multi-Object Tracking)代码训练——小白必看

    前言 自己在跑JDE多目标跟踪代码时,总结的方法和教训. 一.数据集制作 1.可直接下载作者给的数据集,是制作好的 论文链接:https://arxiv.org/pdf/1909.12605v1.pd ...

  7. 走进VOT--《High Performance Visual Tracking with Siamese Region Proposal Network》阅读翻译

    前言:siamRPN是Siamfc之后的又一突破.SiamFC的缺点: Siamese的方法只能得到目标的中心位置,但是得不到目标的尺寸,所以只能采取简单的多尺度加回归,这即增加了计算量,同时也不够精 ...

  8. 笔记:A Novel Representation of Parts for Accurate 3D Object Detection and Tracking in Monocular Images

    A Novel Representation of Parts for Accurate 3D Object Detection and Tracking in Monocular Images 20 ...

  9. LightTrack: Finding Lightweight Neural Networks for Object Tracking via One-Shot Architecture Search

    Abstract 目标跟踪在过去几年中取得了重大进展.然而,最先进的跟踪器变得越来越复杂和昂贵,这限制了它们在资源受限的应用程序中的部署. 在这项工作中,我们提出了LightTrack,它使用神经结构 ...

最新文章

  1. 064文件方式实现完整的英文词频统计实例
  2. 2018.11.06-知识回顾
  3. 蓝桥杯:基础练习 特殊的数字
  4. 找出不超过40亿个给定整数的整数
  5. iOS开发资源(持续更新)
  6. day 01 python爬虫原理
  7. 光流 | MATLAB实现 Brox Optical Flow(代码类)
  8. 如何將Clonezilla live放到一個已經有其他作業系統存在的硬碟中
  9. anaconda怎么使用python包_Anaconda中python包的介绍与使用方法
  10. IP过滤-驱动和应用程序通信
  11. kali 切换root权限_Ubuntu 被曝严重漏洞:切换系统语言 + 输入几行命令,就能获取 root 权限...
  12. Bootstrap 标签页Tab插件使用方法
  13. poj 1797 HeavyTransportation——最小边的最大值
  14. SharePoint自动化系列——通过PowerShell创建SharePoint Lists
  15. 运行adb devices命令后 显示 List of devices attached 无法获取设备解决方法
  16. OpenCV 使用光流法检测物体运动
  17. jquery中如何获得时间
  18. 使用影子系统后win10导致的蓝屏解决办法
  19. 银行联行号cnasp查询(二)
  20. 硬盘格式化怎么操作?

热门文章

  1. java当前时间推前三个月_获取当前时间的前三个月 java
  2. python搭建selenium_了解搭建selenium安装以及配置环境
  3. columnproperty server sql_获取SQL Server表字段的各种属性
  4. zen服务器芯片,服务器版Zen处理器简直大杀器:32核64线程,8通道DDR4内存
  5. 几何画板自定义工具_几何画板最强版 v5.06 中文版(含教程/实例/控件/打包机/工具集)...
  6. 计算机网络互联网技术实验报告,2013计算机网络技术与应用.实验报告01
  7. 苏泊尔搭载华为鸿蒙系统,华为鸿蒙打算在一年内跨过生死线,拿下16%的市场份额...
  8. windows如何添加本机dns记录_运维必看!超清晰的 DNS 原理入门指南
  9. 77. 组合016(回溯法)
  10. 「offer来了」2种递进学习思维,24道计网题目,保姆级巩固你的计网知识体系