首页 > 其他分享 >D2. Set To Max (Hard Version)

D2. Set To Max (Hard Version)

时间:2024-04-12 14:46:09浏览次数:32  
标签:Set 200005 int Max while && front D2 size

原题链接

题解

具体想 \(a\) 是如何一步一步变成 \(b\) 是很复杂的,所以我们换个角度思考(比如贡献)
遍历每一个 \(a[i]\) 看看他们能帮助哪些 \(a[j]\) 变成 \(b[j]\) 而且不妨碍 \((i,j)\) 中 \(a\) 的元素,用数学语言表达就是 \(use[j]=1;a[i]=b[j]>a[j];a[l]<a[i],l\in(i,j)or(j,i)\)
再换句话说就是维护一个单调队列,单调队列中的元素为 \(a[i]\),遍历到当前元素为 \(a[j]\) 满足 \(a[l]<=a[i]<=b[l]\) 对于 \(l\in(i,j)\) 均成立,然后反方向再遍历一次
如果单调队列中含有元素 \(b[j]\) 那么说明 \(j\) 是可以达到的

code

#include<bits/stdc++.h>
using namespace std;
int a[200005]={0},b[200005]={0},judge[200005]={0};
int n;
int solve1()
{
    deque<int> q;
    for(int i=1;i<=n;i++)
    {
        if(a[i]>b[i]) return 0;
        while(q.size()&&q.back()<=a[i])q.pop_back();
        q.push_back(a[i]);
        while(q.size()&&q.front()>b[i]) q.pop_front();
        if(q.size()&&q.front()==b[i]) judge[i]=1;

    }
    //for(int i=1;i<=n;i++) printf("%d:%d\n",i,judge[i]);
    return 1;
}

int solve2()
{
    deque<int> q;
    for(int i=n;i>=1;i--)
    {
        if(a[i]>b[i]) return 0;
        while(q.size()&&q.back()<=a[i])q.pop_back();
        q.push_back(a[i]);
        while(q.size()&&q.front()>b[i]) q.pop_front();
        if(q.size()&&q.front()==b[i]) judge[i]=1;

    }
    //for(int i=1;i<=n;i++) printf("%d:%d\n",i,judge[i]);
    return 1;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];

        for(int i=1;i<=n;i++) cin>>b[i];

        int flag=1;

        if(!solve1()) flag=0;

        if(!solve2()) flag=0;

        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            cnt+=judge[i];
            judge[i]=0;
        }
        if(cnt==n&&flag) puts("YES");
        else puts("NO");
    }
    return 0;
}

标签:Set,200005,int,Max,while,&&,front,D2,size
From: https://www.cnblogs.com/pure4knowledge/p/18131180

相关文章

  • php的isset、empty、is_null的区别
    isset判断变量是否定义或者是否为空变量存在返回ture,否则返回false变量定义不赋值返回falseunset一个变量,返回false变量赋值为null,返回falseempty:判断变量的值是否为空,能转换为false的都是空,为空返回true,反之返回false。"",0,"0",NULL,FALSE都认为为空,返回true没有任何......
  • 3dmax2024渲染大图高清参数,3dmax效果图渲染设置
    ​2024版的3dsMax带来了更为强大的渲染工具和优化的参数设置,使得设计师能够创造出令人惊叹的视觉作品,何利用3dsMax2024的先进功能,精心调整渲染参数,以实现高分辨率、高质量的效果图输出,满足专业设计和视觉表现的需求。下面一起来看看。3dmax2024渲染高清图的参数设置1、打开......
  • MAX868EUB 开关稳压器芯片 MSOP-10
    MAX868EUB是一款开关稳压器集成电路(IC),由MaximIntegrated公司生产。它是一种固定充电泵开关稳压器,具有正或负输出配置,拓扑结构为充电泵。该器件适用于需要稳定电源输出的应用,例如可穿戴设备和其他电子产品。 MAX868EUB开关稳压器集成电路适用于需要稳定电源输出的各种应用......
  • 52 Things: Number 6: How can we interpret NP as the set of theorems whose proofs
    52Things:Number6:HowcanweinterpretNPasthesetoftheoremswhoseproofscanbecheckedinpolynomialtime?52件事:第6点:我们如何将NP解释为一组定理,其证明可以在多项式时间内检查?Thisisthelatestinaseriesofblogpoststoaddressthelistof ......
  • 副本集replicaSet
    mongodb高可用架构https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/复制是跨多个服务器同步数据的过程。复制提供冗余,并通过不同数据库服务器上的多个数据副本增加数据可用性。复制保护数据库免受单个服务器的丢失。复制还允许从硬件故障和服务中断中恢......
  • ABC348G Max(Sum-Max)
    将\(b\)升序排序考虑问题,那么最大值就是下标最大的\(b_i\)。下文的\(a_i,b_i\)都是排序过后的。考虑\(k\)固定怎么做:枚举\(b_i\)作为最大值,那么最大值为\(b_i\)时的答案最大值为此时\(a\)的前\(i\)项的前\(k\)大值的和减去\(b_i\)。将每次计算的结果取max即......
  • 布隆过滤器 及 Redis Sorted sets 使用注意事项
    布隆过滤器基本概念布隆过滤器(英语:BloomFilter)是1970年由伯顿·霍华德·布隆(BurtonHowardBloom)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有......
  • 基于PSO的NARMAX模型参数辨识算法matlab仿真
    目录1.算法仿真效果2.MATLAB源码3.算法概述4.部分参考文献1.算法仿真效果matlab2022a仿真结果如下:......
  • group by grouping sets计算每个分组的占比
    计算每个分组的数量selectparent_dict_code,count(*)fromtb_data_dictgroupbyrollup(parent_dict_code);计算占比,注意要*1.0,否则仍为整型,全为0selectparent_dict_code,count(data_dict_id),(selectcount(data_dict_id)fromtb_data_dict)assum_all,count(data_dict......
  • CF1913C Game with Multiset 题解
    翻译初始时你有一个空序列,共\(m\)次操作,每次操作读入两个数\(t_i\),\(v_i\),分为以下两种操作:当\(t_i=1\)时,在空序列中加入\(2^{v_i}\)这一元素。(此时\(0\lev_i\le29\))当\(t_i=2\)时,询问是否存在:取当前序列的某些元素,使它们的的和等于\(v_i\)(此时\(0\lev_i\l......