【AGC009C】Division into Two
【AGC009C】Division into Two
题面
题解
首先有一个比较显然的\(n^2\)算法:
设\(f_{i,j}\)表示\(A\)序列当前在第\(i\)个,\(B\)序列当前在第\(j\)个的方案数,发现\(i,j\)大小没有限制不是很好转移,于是再设一个\(g_{i,j}\)表示\(B\)序列当前在第\(i\)个,\(A\)序列当前在第\(j\)个的方案数的,这样子我们就可以钦定\(i>j\)了,转移会方便许多。
转移如下:
\begin{aligned}
f_{i+1,j}\leftarrow f_{i,j}(a_{i+1}-a_i\geq A)\\
g_{i+1,i}\leftarrow f_{i,j}(a_{i+1}-a_j\geq B)\\
g_{i+1,j}\leftarrow g_{i,j}(a_{i+1}-a_i\geq B)\\
f_{i+1,i}\leftarrow g_{i,j}(a_{i+1}-a_j\geq A)
\end{aligned}
\right.
\]
然后让我们想一想怎么优化这个东西。
不妨设\(A<B\),则对于\(\forall i\geq 3,a_i-a_{i-2}\geq A\),对于不符合的我们直接判掉。
设\(f_i\)表示当前\(B\)序列在\(i\)的方案数,我们对于可以转移过来的\(j\),必须要满足\(a_i-a_j\geq B\),而对于\(\forall k\in [j+1,i-1]\),则要满足\(a_k-a_{k-1}\geq A\),考虑到这样的\(j\)是一个区间,而区间左右端点单调,我们把这个区间搞出来然后前缀和优化即可。
复杂度\(O(n)\)。
代码
\\O(n^2)
int main () {
scanf("%d %lld %lld", &N, &A, &B);
if (A > B) swap(A, B);
for (int i = 1; i <= N; i++) scanf("%lld", a + i);
for (int i = 3; i <= N; i++) if (a[i] - a[i - 2] < A) return puts("0") & 0;
a[0] = -1e18;
int ans = 0;
f[1][0] = 1, g[1][0] = 1;
for (int i = 1; i <= N; i++)
for (int j = 0; j < i; j++) {
if (a[i + 1] - a[i] >= A) f[i + 1][j] = (f[i + 1][j] + f[i][j]) % Mod;
if (a[i + 1] - a[j] >= B) g[i + 1][i] = (g[i + 1][i] + f[i][j]) % Mod;
if (a[i + 1] - a[i] >= B) g[i + 1][j] = (g[i + 1][j] + g[i][j]) % Mod;
if (a[i + 1] - a[j] >= A) f[i + 1][i] = (f[i + 1][i] + g[i][j]) % Mod;
}
for (int i = 0; i < N; i++) ans = (ans + (f[N][i] + g[N][i]) % Mod) % Mod;
printf("%d\n", ans);
return 0;
}
\\O(n)
int main () {
scanf("%d %lld %lld", &N, &A, &B);
for (int i = 1; i <= N; i++) scanf("%lld", a + i);
if (A > B) swap(A, B);
for (int i = 3; i <= N; i++) if (a[i] - a[i - 2] < A) return puts("0") & 0;
f[0] = s[0] = 1;
int l = 0, r = 0;
for (int i = 1; i <= N; i++) {
while (r < i - 1 && a[i] - a[r + 1] >= B) ++r;
if (l <= r) f[i] = (s[r] - (l ? s[l - 1] : 0) + Mod) % Mod;
s[i] = (s[i - 1] + f[i]) % Mod;
if (i != 1 && a[i] - a[i - 1] < A) l = i - 1;
}
int ans = 0;
for (int i = N; ~i; i--) {
ans = (ans + f[i]) % Mod;
if (i != N && a[i + 1] - a[i] < A) break;
}
printf("%d\n", ans);
return 0;
}
【AGC009C】Division into Two的更多相关文章
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【BZOJ】【1385】【Baltic2000】Division expression
欧几里得算法 普通的求个gcd即可……思路题 因为要求尽量是整数……所以 $\frac{x_1}{x_2*x_3*x_4*....*x_n}$是最大的结果了,因为$x_2$必须为分母,$x_1$必须为 ...
- 【UVA11859】Division Game(SG函数,Nim游戏)
题意:给定一个n*m的矩阵,两个游戏者轮流操作. 每次可以选一行中的1个或多个大于1的整数,把它们中的每个数都变成它的某个真因子,不能操作的输. 问先手能否获胜 n,m<=50,2<=a[ ...
- 【BZOJ4421】[Cerc2015] Digit Division 动态规划
[BZOJ4421][Cerc2015] Digit Division Description 给出一个数字串,现将其分成一个或多个子串,要求分出来的每个子串能Mod M等于0. 将方案数(mod 1 ...
- 【HDU6037】Expectation Division(动态规划,搜索)
[HDU6037]Expectation Division(动态规划,搜索) 题面 Vjudge 你有一个数\(n\),\(n\le 10^{24}\),为了方便会告诉你\(n\)分解之后有\(m\) ...
- 【题解】HDU5845 Best Division (trie树)
[题解]HDU5845 Best Division (trie树) 题意:给定你一个序列(三个参数来根),然后请你划分子段.在每段子段长度小于等于\(L\)且子段的异或和\(\le x\)的情况下最大 ...
- 【BZOJ】1385 [Baltic2000]Division expression
[算法]欧几里德算法 [题解]紫书原题 #include<cstdio> #include<algorithm> using namespace std; ; int T,t, ...
- 【例题 7-1 UVA - 725】Division
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举分母从0到99999. 得到分子,判断合法 [代码] /* 1.Shoud it use long long ? 2.Have ...
- 【NLP】Python NLTK处理原始文本
Python NLTK 处理原始文本 作者:白宁超 2016年11月8日22:45:44 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开 ...
随机推荐
- Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)
简介 通过上一篇宏哥给各位小伙伴们的引荐,大家移动对这位美女有了深刻的认识,而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里,是不是这样呢???不要害羞直接告诉宏哥:是,就对了.宏哥要的就是这个 ...
- Spring Boot 中 10 行代码构建 RESTful 风格应用
RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...
- Git拉取远程分支命令
如果我们想从Git仓库中拉取一个分支到本地,此处假如远程分支为develop,本地要创建的分支为dev,可以使用以下命令: git init //初始化本地Git仓库 git remote ad ...
- appium+python 多设备并行执行脚本【转】
1.ready.py文件 def getport(): aport = random.randint(4700, 4900) # 判断端口是否被占用 while getDeviceInfo.is_op ...
- 《STL源码剖析》——Vector
vector vector的源码分为多个文件:vector.<<stl_vector.h>> vector的底层实现是在<<stl_vector.h>> ...
- 学习Linq之前必须要了解的扩展方法
本文主要以下面几个方面来详细讲解扩展方法:在C#3.0之前没有扩展方法的状态(或者你不会使用不知道扩展方法的时候).扩展方法的语法及怎么使用.怎么正确的使用扩展方法: 一.首先说一下在C#3.0之前没 ...
- c# 编码风格
此内容为copy别人的,仅供自己参看.如有意见,麻烦通知我,谢谢 1. C# 代码风格要求 1.1注释 类型.属性.事件.方法.方法参数,根据需要添加注释. 如果类型.属性.事件.方法.方法参数的名称 ...
- BUAA-OO-2019 第四单元总结
UML作业架构设计 这一单元的作业本质上是对数据之间的联系进行解析,并重新建立数据结构以方便查询的工作,这就要求我们了解各种UmlElement的结构以及他们之间的关系是如何组织的. 第十三次作业 在 ...
- Gin-Go学习笔记七:Gin-Web框架 布局页面
模板使用 页面布局 1> 一个html页面由:head部分,body部分,内部css,内部js,外联css,外联的js这几部分组成.因此,一个布局文件也就需要针对这些进行拆分. 2> ...
- 跨域漏洞丨JSONP和CORS跨域资源共享
进入正文之前,我们先来解决个小问题,什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 跨域常见的两种方式,分别是JSONP和CORS. 今天i ...