Codeforces Round 1048 (Div. 2)

ABC 略

D

思考什么情况下会出现两种交换不相等的情况,出现一个数它前面有比它大的数,后面有比它小的数,即存在数后面有两个连续递减的数,我们用单调栈处理每个数最近的连续递减的数的位置,然后在给定区间内找到每个位置对应的最小的单调减位置是否在区间内

复制代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
//#define int long long
const int N=5e5+10;
int T,n,q,a[N];
struct RMQ
{
    int nn, K;
    vector<vector<int>> mn;
    void build(const vector<int>& a)
    {
        nn=a.size()-1;
        K = __lg(max((int)1,nn))+1;
        mn.assign(K, vector<int>(nn+1));
        for(int i=1;i<=nn;i++) mn[0][i] = a[i];
        for(int k=1;k<K;k++)
        {
            for(int i=1;i+(1<<k)-1<=nn;i++)
            {
                mn[k][i]=min(mn[k-1][i],mn[k-1][i+(1<<(k-1))]);
            }
        }
    }
    int rangeMin(int l, int r)
    {
        if(l>r) return INT_MAX;
        int k=__lg(r-l+1);
        return min(mn[k][l],mn[k][r-(1<<k)+1]);
    }
};
void solve()
{
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    vector<int> L(n+1,0),R(n+1,n+1),stk;
    for(int i=1;i<=n;i++)
    {
        while(!stk.empty()&&a[stk.back()]<a[i])
        stk.pop_back();
        if(stk.empty()) L[i]=0;
        else L[i]=stk.back();
        stk.push_back(i);
    }
    stk.clear();
    for(int i=n;i>=1;i--)
    {
        while(!stk.empty()&&a[stk.back()]>a[i])
        stk.pop_back();
        if(stk.empty()) R[i]=n+1;
        else R[i]=stk.back();
        stk.push_back(i);
    }
    vector<int> lim(n+1,n+1);
    for(int i=1;i<=n;i++)
    {
        int a=L[i],b=R[i];
        if(a>0&&b<=n) lim[a]=min(lim[a],b);
    }
    RMQ rmq;
    rmq.build(lim);
    while(q--)
    {
        int l,r;
        cin>>l>>r;
        int m=rmq.rangeMin(l,r);
        if(m<=r) cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--) solve();
}
相关推荐
文火冰糖的硅基工坊7 小时前
[人工智能-大模型-54]:模型层技术 - 数据结构+算法 = 程序
数据结构·人工智能·算法
oioihoii7 小时前
当无符号与有符号整数相遇:C++中的隐式类型转换陷阱
java·开发语言·c++
Yupureki7 小时前
从零开始的C++学习生活 13:红黑树全面解析
c语言·数据结构·c++·学习·visual studio
2401_876221347 小时前
Euler
c++·数学·算法
Z...........8 小时前
优选算法(滑动窗口)
数据结构·算法
大数据张老师8 小时前
数据结构——平衡二叉树(2)
数据结构
泡泡鱼(敲代码中)8 小时前
数据结构(顺序表和链表)
笔记·学习·算法
文火冰糖的硅基工坊9 小时前
[人工智能-大模型-58]:模型层技术 - 深度神经网络的本质是一个复杂的复合数学函数
人工智能·神经网络·算法·dnn
酌量9 小时前
基于3D激光点云的障碍物检测与跟踪---(3)基于匈牙利算法的障碍物跟踪
学习·算法·机器人·匈牙利算法·障碍物跟踪
赵杰伦cpp9 小时前
C++的继承机制精讲
java·开发语言·c++·后端