GGreater and Greater(求满足条件的子序列,bitset用法)
Posted starve
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GGreater and Greater(求满足条件的子序列,bitset用法)相关的知识,希望对你有一定的参考价值。
题:https://ac.nowcoder.com/acm/contest/5667/G
题意:给定n个数的数组A,m个数的数组B,问在A中有多少个子数组满足Si>=Bi
分析:我们可以考虑记录合法子数组以数组A中的一个位置代表一个合法子数组(因为长度固定为m);
设bitset 的ans和tmp,其中tmp为1的位置表示,对于当前的bi ,a数组中有哪些比b[i].val大;
如果某个位置x比当前的b[i].val大于等于,那么x-b[i].id的位置就可能形成一个合法序列;
最后答案就是要找出这些所有的开头(即ans中1的个数);
等价于tmp中1的位置向右移动b[i].id位
#include<bits/stdc++.h> using namespace std; #define pb push_back #define MP make_pair typedef long long ll; const int mod=998244353; const int M=150005; const int inf=0x3f3f3f3f; const ll INF=1e18; bitset<150002>ans,tmp; struct node{ int val,id; }a[M],b[M]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i].val),a[i].id=i; for(int i=1;i<=m;i++) scanf("%d",&b[i].val),b[i].id=i; sort(a+1,a+1+n,[&](node A,node B){ return A.val>B.val; }); sort(b+1,b+1+m,[&](node A,node B){ return A.val>B.val; }); ans.set();///初始全1 int nowi=1; for(int i=1;i<=m;i++){ while(nowi<=n&&a[nowi].val>=b[i].val){ tmp.set(a[nowi].id); nowi++; } ans&=(tmp>>b[i].id); } printf("%d ",ans.count()); return 0; }
以上是关于GGreater and Greater(求满足条件的子序列,bitset用法)的主要内容,如果未能解决你的问题,请参考以下文章
css 来自https://stackoverflow.com/questions/10858994/css-media-query-height-greater-than-width-and-vis
leetcode1343. Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold
Leetcode 496. Next Greater Element I