提高组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\)个元素的 ...
随机推荐
- PrimeNG之Input(一)
Input之AutoComplete --自动完成功能是输入组件,提供实时的建议当打字. Import import {AutoCompleteModule} from 'primeng/primen ...
- jquery和js 判断下拉框选项选中值
js <script> var selectId = document.getElementById("VariantType");//获取ID selectId.on ...
- Tea for Mac(mac笔记软件)中文版
为大家分享一款好用且免费的mac笔记软件,Tea for Mac提供了实时渲染的Markdown,功能全面,支持各种快捷键,使用tea mac版时,在段首打@即可快速插入图片.标题.列表等元素,非常便 ...
- BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序
BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...
- tp5命令行
手册->命令行->自定义命令行 1.第一步,配置command.php文件 2.第二步,建立命令类文件 注意:该文件中代码,从文档中粘,以防写错. 名字啥的都不用改,就改命名空间 和 定义 ...
- js添加和删除class
原生主要有三种方法: 1.className var DomClass = document.getElementById("id").className; //删除 pat Do ...
- 小程序使用npm
1.cmd进入小程序的目录,cd C:\Users\lenovo\WeChatProjects\SITfu 2.npm install 3.npm init 4.npm install minipro ...
- OpenStack-Neutron-Fwaas-代码【一】
Kilo的代码中对Fwaas做了优化,可以将规则应用到单个路由上 但是juno里面还是应用到租户的所有路由上的,因此对juno的代码做了修改 1. 介绍 在FWaaS中,一个租户可以创建多个防火墙,而 ...
- forms-隐藏处理
获取pin码. 查看网页源码<form action="" method="post"> PIN:<br> <inpu ...
- 网络-02-端口号-linux端口详解大全
端口详解 1 tcpmux TCP Port Service Multiplexer 传输控制协议端口服务多路开关选择器 2 compressnet Management Utility compr ...