2020牛客多校第二场G_Greater and Greater

在这里插入图片描述在这里插入图片描述

题目大意:给定两个数字串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()
{
    //freopen("ans.txt","r",stdin);  
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值