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;
}
牛客暑期多校训练营题解 文章被收录于专栏

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

全部评论

相关推荐

目前感觉简历还有很多问题,希望各位能不吝赐教以及非常感谢这位老哥——@黑皮白袜臭脚体育生&nbsp;的项目,学完一遍感觉受益颇丰
小菜鸡只想转正:校友,我的建议是冗余的最好去掉,突出重点,比如985,211双一流的提示,专业技能调整到个人项目之后的位置。专业技能感觉写的太细了?占用篇幅最好腾出一点给项目经历,如果没写手机号和邮箱,记得加上。
点赞 评论 收藏
分享
2024-12-26 20:46
复旦大学 C++
国棉17厂丶小王:拿了offer的那个周末晚上去网吧通宵,去网吧不知道玩什么刷了lc的每日一题,然后试着第一次打开了三角洲行动,从此少了一个已经刷了700道题的lc用户,但是烽火地带多了一只🐭🐭
点赞 评论 收藏
分享
hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
昨天 22:29
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务