P5204 [USACO19JAN]Train Tracking 2


毒毒题,对着嘤文题解看了贼久

首先考虑此题的一个弱化版本:如果输入的所有\(c_i\)相等怎么做

现在假设有\(len\)个数,取值从\(v\)到\(10^9\),而且每连续\(k\)个数至少有一个是\(v\)

那么取值就只有\(v\)和\(>v\)两种取值了,\(>v\)的取值有\(10^9-v\)种,设为\(x\)

那么有一个显然的dp,\(f_i\)表示这个问题i个数的答案

枚举这个数列的最后一个取值为\(v\)的数,假设是第\(j\)个,那么后面的\(i-j\)个数有\(x\)种选法

\(f_i=\sum_{j=i-k+1}^{i}x^{i-j}f_{j-1}\)

这个dp显然是不行的,还有一个dp,也是设\(f_i\)表示这个问题i个数的答案

\(f_i=(x+1)f_{i-1}-x^kf_{i-k-1}\)

第\(i\)个数随便选,乘\(i-1\)个数的答案,这时可能出现问题,就是第\(i-k+1\)个数到第\(i\)个数都\(>v\)导致了不合法,所以要减掉这些情况

为什么减掉的是\(x^kf_{i-k-1}\)呢,显然这\(k\)个数的放法共\(x^k\)种没有问题,要注意一下从第\(i-k+1\)个数到第\(i-1\)个数都\(>v\),那么只有第\(i-k\)个数取值是\(v\)才能够满足最小值的条件,所以前面的取值方案数是\(f_{i-k-1}\)

il int solve(int v,int len){
int x=1000000000-v,xk=pow(x,k);
f[0]=f[1]=1;
for(int i=2;i<=len+1;++i){
f[i]=1ll*(x+1)*f[i-1]%mod;
if(i-k-1>=0)f[i]=(f[i]-1ll*xk*f[i-k-1]%mod+mod)%mod;
}
return f[len+1];
}

那么解决了前面的问题,后面的也很好办

设\(s(v,len)\)表示现在假设有\(len\)个数,取值从\(v\)到\(10^9\),而且每连续\(k\)个数至少有一个是\(v\)问题的答案,可以在\(O(len)\)时间内球解

首先,可以将一段相等的\(c\)合并起来

然后(开始口胡)

对于一个段\(c_i=\cdots=c_j\),如果只有这一段,方案数为\(s(c_i,j-i+k)\)

如果有一个\(c_{i-1}>c_i\)

那么可以知道的是

\(\min\{a_{i-1},\cdots,a_{i+k-2}\}=c_{i-1}\)

这里可以推出\(a_{i-1},\cdots,a_{i+k-2}\geq c_{i-1}\)

\(\min\{a_{i},\cdots,a_{i+k-1}\}=c_{i}\)

前面已经推出\(a_{i},\cdots,a_{i+k-2}\geq c_{i-1}>c_{i}\)了,所以这些都不可能是最小值

这一段的最小值只能有一个就是\(a_{i+k-1}=c_{i}\)

前面的数也都在前一段的范围内

所以这一段最前面\(k\)个数就没了,其中前\(k-1\)个数会在前面段计算答案,第\(k\)个数只有一个取值\(c_i\)

对于后面也同理,如果\(c_{j+1}>c_j\)则后面\(k\)个数没了

所以一段的len实际上是\(j-i+k\)减去0到2个\(k\)

对于所有的段依次球解最后方案数乘起来即可

代码极为简单

#include<bits/stdc++.h>
#define il inline
#define vd void
#define mod 1000000007
typedef long long ll;
il ll gi(){
ll x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,k;
int a[100010];
int f[100010];
il int pow(int x,int y){
int ret=1;
while(y){
if(y&1)ret=1ll*ret*x%mod;
x=1ll*x*x%mod;y>>=1;
}
return ret;
}
il int solve(int v,int len){
int x=1000000000-v,xk=pow(x,k);
f[0]=f[1]=1;
for(int i=2;i<=len+1;++i){
f[i]=1ll*(x+1)*f[i-1]%mod;
if(i-k-1>=0)f[i]=(f[i]-1ll*xk*f[i-k-1]%mod+mod)%mod;
}
return f[len+1];
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
n=gi(),k=gi();
for(int i=1;i<=n-k+1;++i)a[i]=gi();
int ans=1,len;
for(int i=1,j;i<=n-k+1;i=j+1){
j=i;
while(a[j+1]==a[i])++j;
len=j-i+k;
if(i!=1&&a[i-1]>a[i])len-=k;
if(j!=n-k+1&&a[j+1]>a[i])len-=k;
if(len>0)ans=1ll*ans*solve(a[i],len)%mod;
}
printf("%d\n",ans);
return 0;
}

P5204 [USACO19JAN]Train Tracking 2的更多相关文章

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

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

  2. [USACO19JAN]Train Tracking 2 P

    拿到本题后,可以观察到一个性质,如果出现了 \(c_i \ne c_{i + 1}\) 那么我们一定可以确定一个位置的值,这启示着我们将 \(c_i\) 相同的部分单独拿出来考虑再将最后的答案合并.于 ...

  3. [luogu5204]Train Tracking 2

    考虑一个位置的上界,即$bi=min(c_{i-k+1},c_{i-k+2},--,ci)$,那么每一个位置有两种方式:1.达到上界:2.未达到上界那么可以将权值相同的ci和bi提出来,由于权值不同的 ...

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

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

  5. [TensorBoard] Train and Test accuracy simultaneous tracking

    训练时的实时状态跟踪的重要性 不言而喻. [Tensorboard] Cookbook - Tensorboard  讲解调节更新频率 直接上代码展示: import numpy as np impo ...

  6. (转)CVPR 2016 Visual Tracking Paper Review

    CVPR 2016 Visual Tracking Paper Review  本文摘自:http://blog.csdn.net/ben_ben_niao/article/details/52072 ...

  7. 论文笔记之:Fully-Convolutional Siamese Networks for Object Tracking

    gansh Fully-Convolutional Siamese Network for Object Tracking 摘要:任意目标的跟踪问题通常是根据一个物体的外观来构建表观模型.虽然也取得了 ...

  8. 论文笔记之:Learning Multi-Domain Convolutional Neural Networks for Visual Tracking

    Learning Multi-Domain Convolutional Neural Networks for Visual Tracking CVPR 2016 本文提出了一种新的CNN 框架来处理 ...

  9. 论文笔记:Learning Attribute-Specific Representations for Visual Tracking

    Learning Attribute-Specific Representations for Visual Tracking AAAI-2019 Paper:http://faculty.ucmer ...

随机推荐

  1. Android常用数据类型转换

    String转int.float.double.byte[].bitmap Int i = Integer.parseInt(str); Float f = Float.parseFloat(str) ...

  2. android一个倾斜的TextView,适用于标签效果

    描述: android一个倾斜的TextView,适用于标签效果 应用截图: 使用说明: <com.haozhang.lib.SlantedTextView android:layout_wid ...

  3. [Hadoop] Windows 下的 Hadoop 2.7.5 环境搭建

    原文地址:https://www.cnblogs.com/memento/p/9148721.html 准备说明: jdk:jdk-8u161-windows-x64.exe hadoop:hadoo ...

  4. JavaScript大杂烩12 - 理解Ajax

    AJAX缘由 再次谈起这个话题,我深深的记得就在前几年,AJAX被炒的如火如荼,就好像不懂AJAX,就不会Web开发一样.要理解AJAX为什么会出现,就要先了解Web开发面临的问题. 我们先来回忆一下 ...

  5. 四元数与欧拉角(RPY角)的相互转换

    RPY角与Z-Y-X欧拉角 描述坐标系{B}相对于参考坐标系{A}的姿态有两种方式.第一种是绕固定(参考)坐标轴旋转:假设开始两个坐标系重合,先将{B}绕{A}的X轴旋转$\gamma$,然后绕{A} ...

  6. Spring Data JPA方法定义规范

    Spring Data Jpa方法定义的规则: (1)简单条件查询 简单条件查询:查询某一个实体类或者集合. 按照Spring Data的规范的规定,查询方法以find | read | get开头, ...

  7. 洗礼灵魂,修炼python(48)--巩固篇—模块

    模块 其实前面都说过的,不过还是系统的再说一次,相信学到这,大部分都被搞忘了吧,所以再提一下,也为后面的博文做铺垫 1.什么是模块 在程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越 ...

  8. StartUML用法

    转载地址  http://blog.csdn.NET/tianhai110 (下面参考了原博主的内容,也加入自己的内容,为了自己脑补,也方便其他看到的人脑补) 使用StartUML绘制用例图:     ...

  9. POI写Word换行

    本文旨在描述基于变量替换生成Word doc文件的换行方式.Word换行主要有两大类,一类是表格单元格文本的换行,另一类是表格之外的文本的换行.对于表格外的文本我们可以使用“\r”或者“(char)1 ...

  10. merge-two-sorted-lists (归并排序中的合并)

    class Solution { public: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { if (l1 == NULL) retur ...