2020牛客多校 G - Greater and Greater 动态规划+bitset优化
程序员文章站
2022-04-02 19:02:56
...
题目链接:
https://ac.nowcoder.com/acm/contest/5667/G
思路与官方题解相同,只是描述方式不同。
设表示子序列与子序列是否匹配,即匹配则为,不匹配则为。可以想到答案就是时子序列与子序列匹配的总数,即
考虑的转移方程即若想子序列与子序列匹配,则需要子序列与子序列匹配,且
可以想到,这个转移的计算复杂度是,约,超时,也超空间。
由于所有值都是0或1,可以采用bitset优化,这样复杂度就变为,,处于可以接受的范围。
设,这样有关的操作,都可以用bitset优化。可以用右移将向前移动一位,使得转移到。对于的判断,可以预处理一个长度为的bitset表,,这样,转移式就优化为
计算时,把个排序后,那么每个只会插在这些中间或两边,因此最多只有个(从全是的情况,到全是的情况)。第种,就是在前一种的基础上在第大的位置上从变为。这样就可以在的复杂度内预处理完。
代码如下(不是我写的):
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10,MAXM=4e4+10;
int n,m,ans,a[MAXN],b[MAXM],pos[MAXN];
bitset<MAXM> s[MAXM],cur,w;
bool cmp(int x,int y){return b[x]<b[y];}
int main()
{
scanf("%d%d",&n,&m);w[m]=1;
for(int i=1;i<=n;i++) scanf("%d",a+i);
for(int i=1;i<=m;i++) scanf("%d",b+i),pos[i]=i;
sort(pos+1,pos+1+m,cmp);
sort(b+1,b+1+m);
for(int i=1;i<=m;i++) s[i]=s[i-1],s[i][pos[i]]=1;
for(int i=n;i>=1;i--)
{
int d=upper_bound(b+1,b+1+m,a[i])-b-1;
cur=(((cur>>1)|w)&s[d]);
if(cur[1]) ans++;
}
printf("%d\n",ans);
}
推荐阅读
-
2020暑期牛客多校第二场G.Greater and Greater(bitset+思维构造)
-
2020牛客暑期多校训练营(第二场)G Greater and Greater bitset+思维
-
2020牛客多校第二场 G - Greater and Greater(思维+bitset)
-
2020牛客多校 2G.Greater and Greater(双指针+bitset优化)
-
【Newcoder】2020牛客暑期多校训练营(第二场)G - Greater and Greater | bitset、思维
-
2020牛客多校二 G. Greater and Greater (双指针+bitset优化)
-
2020牛客多校 G - Greater and Greater 动态规划+bitset优化
-
牛客多校补题 Greater and Greater bitset
-
2020牛客多校第二场(G题)Greater and Greater
-
G-Greater and Greater 2020牛客多校第二场