提高组noip2015
一道二分答案裸题,一道dp,一道各种裸题的混合(树上差分+二分答案+LCA)
stone:
二分查找裸题啊:
int check(int x)
{
int cnt=,last=;
for(int i=;i<=n;i++)
if(a[i]-a[last]<x) cnt++;//已经是最小值了,所以没有比他更小的,有更小的就要移开
else last=i;//推起走
if(cnt>m) return ;
return ;
} void find(int l,int r)
{
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid))
{
ans=max(ans,mid);
l=mid+;//二分查找满足单调性,既然它满足,那么比它大的也可能满足,就往大的去推(比较是找最大值)
}
else r=mid-;
}
}
int main()
{
scanf("%d%d%d",&len,&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
find(,len);
printf("%d",ans);
return ;
}
substring:
DP:考虑当前匹配成功与否
这种两个串一个一个挨着去找的有没有LIS,LCS的感觉——>大佬们就想到了dp(然而自己没有
状态
首先我们考虑设计状态。我们发现,为了保证无后效性的一位一位往后推,我们需要记录当前推到aa串的哪一个位置了;接着还有记录匹配了bb串的那几个字符。因为是按照原串顺序,所以相当于是即匹配bb的前几个字符。有这些还不够,我们还要记录划分了几个子串。最后,为了便于转移,我们还要标记一维0/1状态,表示aa串中的第ii个字符是否选入。
这样,我们就设计好了状态。我们记f_{i,j,p,v}fi,j,p,v表示到aa串的第ii个位置为止使用pp个子串匹配bb串前jj位字符且第ii个位置选或不选(vv)的方案数。
转移
设计好状态,不会转移怎么行。我们分情况考虑。
当a_i=b_jai=bj时:
f_{i,j,p,0}fi,j,p,0:由于这位不选,所以就是前面一位选和不选方案数之和,即f_{i,j,p,0}=f_{i-1,j,p,0}+f_{i-1,j,p,1}fi,j,p,0=fi−1,j,p,0+fi−1,j,p,1。
容易得到f_{i,j,p,1}=f_{i-1,j-1,p,1}+f_{i-1,j-1,p-1,0}+f_{i-1,j-1,p-1,1}fi,j,p,1=fi−1,j−1,p,1+fi−1,j−1,p−1,0+fi−1,j−1,p−1,1.
当a_i\ne b_jai≠bj时:
不选情况同上,即f_{i,j,p,0}=f_{i-1,j,p,0}+f_{i-1,j,p,1}fi,j,p,0=fi−1,j,p,0+fi−1,j,p,1.
由于选不了,自然就是00,即f_{i,j,p,1}=0fi,j,p,1=0.
优化空间
如果你读完状态设计之后又稍微思考就会发现,空间可能较大。空间不够怎么办?在luogu还好说,如果真的在NOIP,应该是不敢开1000\times200\times200\times2=8\times10^71000×200×200×2=8×107的数组吧。所以我们观察转移方程,发现每次转移只用到了前一位!于是我们把第一维很愉快地滚掉了。这样,空间复杂度就保证是O(mk)O(mk)了。那么时间呢?时间是O(n\cdot mk)O(n⋅mk),但是时间不像空间,这个复杂度是可以接受的。于是,完整算法就结束了。
#pragma GCC optimize (2)
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long ll;
int n,m,k;
int a[],b[];
char aa[],bb[];
ll f[][][][]; int main()
{
cin>>n>>m>>k;
scanf("%s",aa);
scanf("%s",bb);
if(n<m)
{
printf("0\n");
return ;
}
for(int i=;i<n;++i) a[i+]=aa[i]-;
for(int i=;i<m;++i) b[i+]=bb[i]-;
f[][][][]=f[][][][]=;
for(int i=;i<=n;++i)
{
for(int j=;j<=m;++j)
{
for(int c=;c<=k;++c)
{
if(a[i]==b[j])
{
f[i%][j][c][]=(f[(i+)%][j][c][]+f[(i+)%][j][c][])%mod;
f[i%][j][c][]=(f[(i+)%][j-][c][]+f[(i+)%][j-][c-][]+f[(i+)%][j-][c-][])%mod;
}
else
{
f[i%][j][c][]=(f[(i+)%][j][c][]+f[(i+)%][j][c][])%mod;
f[i%][j][c][]=;
}
}
}
}
cout<<(f[n%][m][k][]+f[n%][m][k][])%mod<<endl;
return ;
}
为了避免&1,^1的麻烦用%2
1s极限:1e8
提高组noip2015的更多相关文章
- [NOIP2015] 提高组 洛谷P2615 神奇的幻方
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- 洛谷-神奇的幻方-NOIP2015提高组复赛
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 【数据结构】运输计划 NOIP2015提高组D2T3
[数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...
- 【二分查找】 跳石头NOIP2015提高组 D2T1
[二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...
- 刷题总结——子串(NOIP2015提高组)
题目: 题目背景 NOIP2015 提高组 Day2 T2 题目描述 有两个仅包含小写英文字母的字符串 A 和 B .现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在 ...
- 【题解】NOIP2015提高组 复赛
[题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...
- noip2015 提高组 day1t1 神奇的幻方
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,--,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T2 Lucas的数列
[NOIP2015模拟11.5]JZOJ8月5日提高组T2 Lucas的数列 题目 PS:\(n*n*T*T<=10^{18}\)而不是\(10^1*8\) 题解 题意: 给出\(n\)个元素的 ...
随机推荐
- oracle两种分页查询
第一种: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM table_name) A ) ; 第二种: SELECT * FROM ( ...
- VSS(Virtual Switching System)
一.虚拟交换系统(VSS) VSS是一种网络虚拟化技术,讲两台Catalyst 6500系列交换机组合为单一虚拟交换机,从而提高运营效率.增强不间断通信,并将系统带宽容量扩展到1.4Tbps.在初始阶 ...
- C# 多线程之Task(任务
1.简介 为什么MS要推出Task,而不推Thread和ThreadPool,以下是我的见解: (1).Thread的Api并不靠谱,甚至MS自己都不推荐,原因,它将整个Thread类都不开放给W ...
- bootstrap引入
方法一: 注意:引入js时需先引入jQuery 1.在bootstrap中文网上下载源码,解压到路径 (<E:\Lern\bootstrap>) 2 ...
- JS对象、构造器函数和原型对象之间的关系
一.基本概念 1.对象:属性和方法的集合,即变量和函数的封装.每个对象都有一个__proto__属性,指向这个对象的构造函数的原型对象. 2.构造器函数:用于创建对象的函数,通过new关键字生成对象. ...
- CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒
问题: CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒.拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Wind ...
- jdk安装路径
问题:jdk1.4.2安装目录设成D盘,为什么装完后,C盘也有了一个200多兆的JAVA文件夹?里面我看了一下,有j2re1.4.2_13 jdk1.5.0_09 jr ...
- UEP-添加
添加数据时候自动更新时间,注意添加数据时,要设置最大主键 时间的工具类:CommonUtil 人的工具类: ContextUtil ScmCompanyAccount scmCompanyAccoun ...
- 百度站内搜索https不可用切换api搜索,加上谷歌api站内搜索
google推https几年了,百度开始宣传全面https,但是,百度站内搜索 自己的服务却不走https,接口报错.百度分享也是. 然后采用http://search.zhoulujun.cn/cs ...
- SQL死锁操作
这两天数据库经常被锁,所以记录一下操作: 查看被锁表:select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) ...