![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/60812591a18fb6c7cef2845e6e0c14c2.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/588ae5c24aedb99fb6c826907e5e50d2.png)
题目大意:给定两个数字串A,B,长度分别为n和m,n>=m;问A里面有几个字串S,满足Si>=Bi,(1<=i<=m);
a1 a2 a3 a4 a5 a6 a7
b1 b2 b3
1)
a1 a2 a3
b1 b2 b3
2)
a2 a3 a4
b1 b2 b3
3)
a3 a4 a5
b1 b2 b3
4)
a4 a5 a6
b1 b2 b3
5)
a5 a6 a7
b1 b2 b3
如果合法应该满足:Si>=Bi,(1<=i<=m);
一共上面5个匹配串,
b1-->a1,a2,a3,a4,a5;a1 代表b1匹配的起点
b2-->a2,a3,a4,a5,a6;a2 代表b2匹配的起点
b3-->a3,a4,a5,a6,a7;a3 代表b3匹配的起点
c1 c2 c3 c4 c5
ci代表第i个串合法,ci=(ai>=b1)&&(aj>=b2)&&(ak>=b3);
只需要找出来a中那几个数大于当前的b即可;
这里有个继承的关系,如果b1>b2&&a1>b1--->a1>b2;
因此对a和b进行排序,排序之后依次处理b1---bm,用一个bitset tx记录a中的哪一位大于或等于b[i:m];则tx>>(bi.postion-1)对应bi匹配的a,如上面(b2-->a2,a3,a4,a5,a6;);
在用一个bitset ty记录C的情况
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<bitset>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#define ls(k) (k)<<1
#define rs(k) (ls(k))|1
#define fi first
#define se second
#define bug(p) cout<<p<<endl
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef double dd;
typedef pair<int,int>pii;
const int inf=0x3f3f3f3f;
const int Nn=1*150000+10;
const int Nm=2*1e6+10;
const int mod=100000007;
const dd esp=1e-6;
int n,m;
bitset<Nn>tx,ty;
pii a[Nn],b[Nn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) { scanf("%d",&a[i].fi);a[i].se=i; }
for(int i=1;i<=m;i++) { scanf("%d",&b[i].fi);b[i].se=i; }
sort(a+1,a+n+1,greater<pii> ());
sort(b+1,b+n+1,greater<pii> ());
int pa=1,pb=1;
ty.set();
while(pa<=n&&pb<=m)
{
while(pa<=n&&a[pa].fi>=b[pb].fi){ tx[a[pa].se]=1;pa++;}
ty&=tx>>(b[pb].se-1);
pb++;
}
int ans=0;
for(int i=1;i<=n-m+1;i++) ans+=ty[i];
cout<<ans;
return 0;
}