原题链接
orz xzz巨佬
首先发现一个结论:两个相邻的\(c\)值如果不相同的话,就可以固定某个位置的值了
这启示我们把连续且相等的\(c\)给单独拿出来看,也就是对于一些\(c_i=c_{i+1}=...=c_j=v\),能不能从中得出一些东西
这一段代表的区间总长为\(j-i+k\),所有的数都大于等于\(v\),同时每\(k\)个中就有至少一个\(v\),有一个比较显然的\(dp\):设\(f[i]\)表示最后一个\(v\)在\(i\)位置时的合法方案数,\(p\)为\(1e9-v\)那么有转移
\[f[i]=\sum\limits_{j=i-k}^{i-1}p^{i-j-1}f[j]\]
这样是\(O(nk)\)的,不可接受,于是用一个错位相消就可以得到一个可以\(O(1)\)转移的式子
\[f[i]=(p+1)f[i-1]-p^k*f[i-k-1]\]
其实上面这个式子也有实际意义,可以直接推出来
然后把这一段的\(c\)放到序列中看看,考虑它们左右的两个数\(c_{i-1}\)和\(c_{j+1}\)影响(\(a\)为原序列)
①如果\(c_{i-1}>c_i\),表明\(a_{i+k-1}=v\)且\(c_i~c_j\)中的前\(k-1\)个在前一段中已经被考虑过了,因此本次需要考虑的长度减少\(k-1+1=k\)个
②如果\(c_{j+1}>c_j\),表明\(a_{i-k+1}=v\)且\(c_i~c_j\)中的后\(k-1\)个在后一段中已经被考虑过了,因此本次需要考虑的长度也减少\(k-1+1=k\)个
这意味着我们只需要在\(i-j+k\)的基础上减掉几个\(k\)就可以将其化归到上一个模型上去了
具体实现的话,我们只需要找出所有的极大连续相等子段并把它们的贡献累乘起来就行了
代码

#include <algorithm>
#include  <iostream>
#include   <cstdlib>
#include   <cstring>
#include    <cstdio>
#include    <random>
#include    <string>
#include    <vector>
#include     <cmath>
#include     <ctime>
#include     <queue>
#include       <map>
#include       <set>#define IINF 0x3f3f3f3f3f3f3f3fLL
#define u64 unsigned long long
#define pii pair<int, int>
#define mii map<int, int>
#define u32 unsigned int
#define lbd lower_bound
#define ubd upper_bound
#define INF 0x3f3f3f3f
#define vi vector<int>
#define ll long long
#define mp make_pair
#define pb push_back
#define is insert
#define se second
#define fi first
#define ps push#define $SHOW(x) cout << #x" = " << x << endl
#define $DEBUG() printf("%d %s\n", __LINE__, __FUNCTION__)using namespace std;#define MAXN 100000
#define MOD 1000000007int n, k, c[MAXN + 5], f[MAXN + 5];int fpow(int x, int p) {int ret = 1;while (p) {if (p & 1) ret = 1LL * ret * x % MOD;x = 1LL * x * x % MOD;p >>= 1;}return ret;
}int solve(int v, int l) {int p = 1000000000 - v, pk = fpow(p, k);f[0] = f[1] = 1;for (int i = 2; i <= l + 1; ++i) {f[i] = 1LL * (p + 1) * f[i - 1] % MOD;if(i - k - 1 >= 0) f[i] = (f[i] - 1LL * pk * f[i - k - 1] % MOD + MOD) % MOD;}return f[l + 1]; // 注意这里返回l+1而不是l,否则就会钦定a[l]为v了
}int main() {scanf("%d%d", &n, &k);for (int i = 1; i <= n - k + 1; ++i) scanf("%d", &c[i]);int ans = 1;for (int i = 1, j, len; i <= n - k + 1; i = j + 1) {j = i;while (c[j+1] == c[i]) 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) ans = 1LL * ans * solve(c[i], len) % MOD;}printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/dummyummy/p/11039476.html

[USACO19JAN]Train Tracking 2——神仙结论题+DP相关推荐

  1. Codeforces Round #633 B. Edge Weight Assignment 结论题 + dp

    传送门 文章目录 题意: 思路: 题意: 思路: 首先考虑最小值,如果从一个叶子结点出发到任意叶子的距离都为偶数,那么只需要一个值就可以满足条件.如果有奇数的,考虑111 ^ 222 ^ 3=03=0 ...

  2. 2019暑假五考Ronald(神仙结论题)

    ~目录~ 题目 思路 Code 题目 描述 一个国家有n个城市,城市之间连接着双向航空线路.一位疯狂的航空公司总裁Ronald Krump经常改变航班时刻表.更准确地说,他每天都做以下事情: ●选择其 ...

  3. [USACO19JAN,Platinum]Train Tracking 2

    虽然是简单的dp ,but真的太难想到了,而且我的码力... Train Tracking 2 [题目描述] 每天特快列车都会经过农场.列车有N节车厢(1≤N≤105),每节车厢上有一个1到109之间 ...

  4. CodeForces - 1498E Two Houses(交互+图论,结论题)

    题目链接:点击查看 题目大意:给出一个由 nnn 个点组成的竞赛图,现在要求出一组点对 (A,B)(A,B)(A,B),满足两个点可以互达,且入度的绝对值之差最大 题目分析:结论题,先放结论: 结论: ...

  5. agc015F - Kenus the Ancient Greek(结论题)

    题意 题目链接 $Q$组询问,每次给出$[x, y]$,定义$f(x, y)$为计算$(x, y)$的最大公约数需要的步数,设$i \leqslant x, j \leqslant y$,求$max( ...

  6. 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组

    题目描述 给出两个长度为 $n$ 的排列 $A$ 和 $B$ ,如果 $A_i>A_{i+1}$ 则可以交换 $A_i$ 和 $A_{i+1}$ .问是否能将 $A$ 交换成 $B$ . 输入 ...

  7. CF869A The Artful Expedient 结论题+数论

    传送门 题目描述 Tommy和Karen在玩一个游戏. 他们各自准备了一个长度为n的数组,Tommy的数组称作a,Karen的数组称作b. 保证这2n个数互不相同,设这2n个数构成的集合为S. 现在他 ...

  8. 数字迷阵(矩阵快速幂+结论题)

    数字迷阵(矩阵快速幂+结论题) 题目描述 小可可参观科学博物馆时,看到一件藏品,上面有密密麻麻的数字,如下所示:    1   2   3   5    8    13   21   34   55 ...

  9. 牛客练习赛51 C 勾股定理 (结论题)

    大致题意 给一个 n (1<=n<=1e9) ,求其组成直角三角形的另外两条边,输出任意一组即可. 思路 结论题 除了 1,2 没用答案,其余的所有正整数满足以下勾股数结论. 可以记忆一下 ...

最新文章

  1. 第四节:IO、序列化和反序列化、加密解密技术
  2. jx problem
  3. jquery.validate.js的使用小结
  4. jquery 如何保存拖动空间的位置
  5. PHP使用GD库封装验证码类
  6. vscode设置python多进程调试_python之vscode配置开发调试环境
  7. linux中特殊符号分割,Shell_Linux Shell 中实现字符串切割的几种方法
  8. C++ 中的友元(friend)
  9. 数据结构(严蔚敏版)与算法的实现(含全部代码)
  10. 三星固态860evo安装_固态要涨价了?我赶紧屯了这几块好货
  11. 基因组注释2. 非编码基因和编码基因预测tRNAScan-SE、rRNAmmer和Prodigal
  12. 汇率兑换查询易语言代码
  13. CVPR 2020 论文大盘点-人脸技术篇
  14. 熬夜整理了2021年Python最新学习资料,分享给学弟学妹们【大学生必备】
  15. 仪器分析和计算机,化学分析和仪器分析的区别
  16. 编译报错undefined symbol: vtable for
  17. 乡郎桑黄:什么是桑黄?桑树的价值有哪些?
  18. SpringBoot基于websocket的网页聊天
  19. 计算机名改了怎么恢复,手把手练习win10系统改计算机名和工作组的恢复技巧
  20. 电磁兼容性(EMC)概述

热门文章

  1. python的整数类型有几种进制_(一)Python入门-2编程基本概念:08整数-不同进制-其他类型转换成整数...
  2. 计算机系统的架构,计算机系统结构 (二) 计算机主要系统构成
  3. Python2.7连接MySQL5.7 附demo
  4. python【力扣LeetCode算法题库】100-相同的树
  5. 2 resize 到指定大小_阿里巴巴为什么让初始化集合时必须指定大小?
  6. python 列表输入sql_SQL查询中的Python列表作为参数
  7. od 追踪_裁判员行为规范【基本功】——追踪裁判违例宣判练习 /五秒违例
  8. 网站优化不仅仅只为排名而在!
  9. react实战项目_前端学习路线图--从网页设计到项目开发
  10. cisco 路由器监控路由连通性_Cisco-路由器配置DHCP小实验