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. IDEA工具配置weblogic

    1.首先打开IDEA,点击Run-Edit Configurations… 2.配置weblogic页面 2.1点击“+”号,选WeblogicServer-local 2.2红框的是新添加的服务,起 ...

  2. Linux两种方式rd.break和init重置root管理员密码

    centos7/rhel7进入单用户方式和重置密码方式发生了较大变化,GRUB由b引导变成了ctrl+x引导. 重置密码主要有rd.break和init两种方法. rd.break方法: 1.启动的时 ...

  3. 菜鸟教程perl总结

    数据类型有:  标量$, 数组@,哈希% 数组声明 :  @hits = (25, 30, 40);  或者  @sites = qw/google taobao runoob/; 数组操作 pop, ...

  4. 使用Windows Live Writer写文章时不要用360清除垃圾

    ref:http://www.zhengsiwei.com/write-an-article-to-use-windows-live-writer-dont-use-360-to-remove-rub ...

  5. 方法的重写(Override)与重载(Overload)的含义与区别

    1.Override(重写) 两同,两小,一大 两同:方法名相同,参数列表相同 两小:抛出的异常要小于等于父类,返回值类型要小于等于父类 一大:访问权限要大于等于父类 2.Overload(重载) 方 ...

  6. saltstack特点

    目录 saltstack特点 saltstack特点 实时交互 所有的minion机器同时执行命令 no freeloader 每一台salt minion上都装有执行master传来的命令所需要的程 ...

  7. 十三、MySQL之IDE工具介绍及数据备份

    一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 # ...

  8. html+css调用服务器端字体

    在浏览网页时,由于客户端没有安装某些特殊字体,导致网页文字无法按设计正常显示,这时我们可以使用服务器字体来避免这种现象的发送 语法 @font-face { /* 自定义字体名称 */ font-fa ...

  9. [Jenkins]持续集成环境下fingbug插件的安装使用与配置

    参考:https://wiki.jenkins.io/display/JENKINS/FindBugs+Plugin 突然,天降杂事.我是想安安静静的做个美丽的测试...但是事与愿违,项目经理叫我帮忙 ...

  10. Android 导出traces.txt 遇到的坑

    我一直以为traces.txt 导出需要root .因为每当我 cd data ll 然后就会告诉我 Permission denied 后来我问同事,怎么导出traces.txt 文件.同事说很简单 ...