2020牛客多校第二场G_Greater and Greater

2020牛客多校第二场G_Greater and Greater_第1张图片2020牛客多校第二场G_Greater and Greater_第2张图片

题目大意:给定两个数字串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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ls(k) (k)<<1
#define rs(k) (ls(k))|1
#define fi first
#define se second
#define bug(p)  cout<
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;
}

你可能感兴趣的:(2020牛客多校训练,二进制)