2020牛客暑期多校训练营(第二场)G

Greater and Greater

https://ac.nowcoder.com/acm/contest/5667/G

题目描述

  Given a sequence of size and a sequence of size , determine the number of subintervals called of size in satisfying , .

输入描述

  The first line contains two integers , . The second line contains integers , denoting the sequence .
The third line contains integers , denoting the sequence .

输出描述

  Only one line containing one integer, denoting the answer.

示例1

输入

6 3
1 4 2 8 5 7
2 3 3

输出

2

说明

  The two subintervals are .

分析

  一道利用 的神题。
  对每一个 求一个长度为 的二进制串 当且仅当
对于样例,可以构造三个二进制串:。设置一个 来代替二进制串,由于 由低位向高位存储,需要将上述二进制串镜像翻转,即 ;比如,。对于一个合法区间,设其起点为 ,则 ;不妨将上述二进制串的向右平移,得到 ;对于同一列,为 的对应大小关系,当且仅当一列有 时,存在一个长度为 的合法区间。也就是说,将移动后的 进行与运算,最后得到的结果中 的个数即为答案;其中,第 个串右移 位。
  最暴力枚举获得 的时间复杂度为 ,显然是不可行的。不妨用 pair<int,int> 记录 为数值, 为元素在原序列中的位置,接着对 按数值降序排列。定义两个 ,用 记录与运算的最后结果(初始化为全 );用 记录 a[j].first>=b[i].first 时, 在原序列中的位置。接下来提到的 中的元素,都为排序后的序列中元素。枚举 ,接着枚举 ,若 a[j].first>=b[i].first,那么令 cur.set(a[j].second);得到 后,将 右移 b[i].second-1 位,同 进行与运算;多次迭代后,ans.count()即为答案。事实上,经过排序后的序列,不必每次都从 开始枚举 ;当枚举 时, 的数值必然比 的数值大,若 a[j].first>=b[i-1].first,必定有 a[j].first>=b[i].first;也就是说,若满足a[j].first>=b[i-1].first的最大的 ,考察 时,直接从 开始枚举即可,上一次得到的 中的 ,在此次的考察中一定是正确的,对于 ,也是不遗漏的。

/******************************************************************
Copyright: 11D_Beyonder All Rights Reserved
Author: 11D_Beyonder
Problem ID: 2020牛客暑期多校训练营(第二场) Problem G
Date: 8/5/2020
Description: To use bitset
*******************************************************************/
#include<iostream>
#include<bitset>
#include<utility>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=150004;
pair<int,int>a[N],b[N];
int n,m;
bitset<N>ans,cur;
int main()
{
    cin>>n>>m;
    int i,j;
    for(i=1;i<=n;i++) 
    {
        int x;
        scanf("%d",&x);
        a[i]=make_pair(x,i);
    }
    for(i=1;i<=m;i++)
    {
        int x;
        scanf("%d",&x);
        b[i]=make_pair(x,i);
    }
    //按数值降序
    sort(a+1,a+1+n,[](const pair<int,int>& x,const pair<int,int>& y){return x.first>y.first;});
    sort(b+1,b+1+m,[](const pair<int,int>& x,const pair<int,int>& y){return x.first>y.first;});
    //初始化
    ans.set();
    cur.reset();
    //枚举 b
    for(i=1,j=1;i<=m;i++)
    {
        //枚举 a
        //利用上次信息
        while(j<=n&&b[i].first<=a[j].first)
        {
            cur.set(a[j].second);
            j++;
        }
        //与运算
        ans&=cur>>b[i].second-1;
    }
    cout<<ans.count()<<endl;
    return 0;
}
牛客暑期多校训练营题解 文章被收录于专栏

收集牛客暑期多校训练营的题解

全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
皮格吉:不,有的厂子面试无手撕,可以试试。都是一边学一边面。哪有真正准备好的时候,别放弃
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务