B-3 SRM 08

描述

给长度为 n 的数列 A 和长度为 m 的数列 B,问有多少长度为 m 的数列 C 满足

输入格式

第一行俩整数 n 和 m

第二行 n 个整数 ,表示数列 A

第三行 m 个整数 ,表示数列 B

输出格式

一个整数,表示满足条件的数列 C 的个数模  后的值。

样例输入 1

5 3
1 5 2 4 7
7 9 6

样例输出 1

4

样例输入 2

4 2
7 7 7 7
3 4

样例输出 2

6

数据范围与约定

样例解释

第一个样例中,数列 C 可以为 (1, 3, 5), (1, 4, 5), (2, 4, 5), (3, 4, 5)

第二个样例中,数列 C 可以为 (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)

这道题呢 很容易想到n^2m复杂度的dp f[i][j] 表示以j结尾长度为i(即匹配到第二个队列的第i个)的符合串

水了点分

#include<cstdio>
#include<cstring>
#include<algorithm>
const int M=,mod=1e9+;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,ans;
int a[M],b[M],f[M][];
int main()
{
n=read(); m=read();
for(int i=;i<=n;i++) a[i]=read(),f[i][]=;
for(int i=;i<=m;i++) b[i]=read();
for(int i=;i<=m;i++){
for(int j=i;j<=n;j++){
for(int k=;k<j;k++)
if(a[k]+b[i-]<=a[j]+b[i]) f[j][i]=(f[j][i]+f[k][i-])%mod;
}
}
for(int i=m;i<=n;i++) ans=(ans+f[i][m])%mod;
printf("%d\n",ans);
return ;
}

当然 这时间复杂度n一大绝对超时 这个时候就要想怎么降低时间复杂度了

观察后发现第三个循环枚举j前面所有点的时候 我们维护的信息明显可以用树状数组维护

我们需要的点的信息要满足 i<j && k[p+1]+b[i-1]<=k[j]+b[i]

那么 我们可以先给k【i】排一波序 然后进行一波离散化 方便后面树状数组的操作

树状数组下标表示相对大小关系

然后我们可以类似递推地求出 如果只考虑大小关系 有多少个数满足上式

考虑前后顺序 那么我们只要按原顺序逐渐插入树状数组中就可以保证了

然后就是单点修改上传信息以及区间求和了

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=,mod=1e9+;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,cnt,f[M],last[M],ans;
int s[M],k[M],b[M],d[M],pos[M];
struct node{int w,pos;}q[M];
bool cmp(node a,node b){return a.w<b.w;}
int lowbit(int x){return x&-x;}
void add(int x,int v){
while(x<=n){
(s[x]+=v)%=mod;
x+=lowbit(x);
}
}
int query(int x){
int ans=;
while(x) (ans+=s[x])%=mod,x-=lowbit(x);
return ans;
}
int main()
{
n=read(); m=read();
for(int i=;i<=n;i++) k[i]=read(),f[i]=,q[i]=(node){k[i],i};
sort(q+,q++n,cmp);
d[++cnt]=q[].w; pos[q[].pos]=;
for(int i=;i<=n;i++){
if(q[i].w!=q[i-].w) d[++cnt]=q[i].w;
pos[q[i].pos]=cnt;
}
for(int i=;i<=m;i++) b[i]=read();
for(int i=;i<=m;i++){
for(int j=;j<=cnt;j++){
int p=last[j-];
while(p<cnt&&d[p+]+b[i-]<=d[j]+b[i]) p++;
last[j]=p;
}
for(int j=;j<=cnt;j++) s[j]=;
add(pos[i-],f[i-]);
for(int j=i;j<=n;j++){
int sum=f[j];
f[j]=query(last[pos[j]]);
add(pos[j],sum);
}
}
for(int i=m;i<=n;i++) (ans+=f[i])%=mod;
printf("%d\n",ans);
return ;
}

汕头市队赛 SRM 08 B的更多相关文章

  1. 汕头市队赛 SRM 08 C

    C-3 SRM 08 描述 给一个图,n 个点 m 条双向边,每条边有其长度.n 个点中有 k 个是特殊点,问任意两个特殊点的最短路是多少. 输入格式 第一行三个整数 n m k 第二行 k 个整数  ...

  2. 汕头市队赛 SRM 08 A

    比赛没参加 所以回来补题咯 A还是自己YY出来了的 可惜比赛没有打 描述 给一个 01 串设为其 S,询问是否存在只出现两次的 01 串 T. 这里的出现定义为存在一串下标 ,满足  且 . 输入格式 ...

  3. 汕头市队赛 SRM 07 D 天才麻将少女kpm

    这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周叒打了n场麻将,但她这次又没控分,而且 ...

  4. 汕头市队赛SRM 20 T2不净的圣杯

    不净的圣杯 SRM 20 背景 作为一张BUG级别的卡,官方打算把它修改得人畜无害一些…… 虽然名字还没想好,但是能力大概是对敌方所有单位造成d点伤害,d为自己牌组中所有卡的编号的最大公约数.这无疑是 ...

  5. 汕头市队赛 SRM 07 B 好玩的麻将

    B 好玩的麻将 SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周又打了n场麻将,又控了分使得自己的排名是1..n的一个排列.     但她 ...

  6. 汕头市队赛 SRM 06 C 秀恩爱

    C 秀恩爱 SRM 06 背景&&描述         KPM坐在直升机上俯瞰小渔村景象.         渔村可看作二维平面,密密麻麻地到处都是单身狗,KPM当前所在坐标为(sx,s ...

  7. 汕头市队赛 SRM 06 A 撕书

    A 撕书 SRM 06 背景&&描述 游行寺汀正在杀书.         书总共有n页,每页都可以看作是一个小写英文字母,所以我们可以把书看成长度为n的字符串s.         琉璃 ...

  8. 汕头市队赛 SRM 06 B 起伏的排名

    B 起伏的排名 SRM 06 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     在上个星期她打了n场麻将,每场麻将都有n名玩家.KPM自然记得自己的n次排名.   ...

  9. 汕头市队赛 SRM 07 A 你的麻将会排序吗

    A 你的麻将会排序吗 SRM 07 曾经有过一些沉迷日麻的小孩纸,后来呀,他们都去寻找自己的世界了. kpm也是这样的小孩纸.他想有一只自动整理牌的机器.当麻将以给定的顺序进入机器时,通过机器的运转, ...

随机推荐

  1. The Road to learn React书籍学习笔记(第一章)

    react灵活的生态圈 Small Application Boilerplate: create-react-app Utility: JavaScript ES6 and beyond Styli ...

  2. 5. css定位 居中

    1.准备工作 (1)添加背景图片 background: url('images/grass.png') (2)背景图片格式 background-size:contain; #完全限制在方框 #co ...

  3. 使用Autofac实现依赖注入注入

    依赖注入是什么意思? 依赖倒置 在软件设计原则中,有一种重要的思想叫做依赖倒置.它的核心思想是:不能让高层组件依赖底层组件,而且,不管高层组件和底层组件,两者都应依赖于抽象.那么,这个原则和我们上面的 ...

  4. 直接选择排序&堆排序

    1.什么是直接选择排序? 直接选择排序(Straight Select Sort)是一种简单的排序方法,它的基本思想是:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i ...

  5. react基本知识点合集

    妹子UI里面有React的相关组件与用法:http://amazeui.org/react/components React官方网站:https://facebook.github.io/react/ ...

  6. 示例解读Java的跨平台原理

    首先简单的解释一下Java跨平台的特征,相当于说写一个Java程序论述上可以运行在不同的操作系统平台上面(此处的平台我们就简单的看成是操作系统平台).下面我们用一些事例来说明它的好处. 我们先了解一些 ...

  7. python学习笔记十七:base64及md5编码

    一.Python Base64编码 Python中进行Base64编码和解码要用base64模块,代码示例: #-*- coding: utf-8 -*- import base64 str = 'c ...

  8. 玩转Node.js(三)

    玩转Node.js(三) 上一节对于Nodejs的HTTP服务进行了较为详细的解析,而且也学会了将代码进行模块化,模块化以后每个功能都在单独的文件中,有利于代码的维护.接下来,我们要想想如何处理不同的 ...

  9. 【Random Forest】林轩田机器学习技法

    总体来说,林对于random forest的讲解主要是算法概况上的:某种程度上说,更注重insights. 林分别列举了Bagging和Decision Tree的各自特点: Random Fores ...

  10. Xcode坑之一Invalid argument

    Xcode坑之一Invalid argument 正在搞代码,运行程序时突然发现程序不能再次运行了,一运行就提示Invalid argument 然后FQ各种查啊,试了好多方法都不行,重启,重置,我用 ...