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();
}
相关推荐
烬羽4 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米4 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
WL学习笔记4 小时前
堆(数据结构)
数据结构·
星空露珠4 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
我不是懒洋洋5 小时前
从零实现一个分布式监控:Prometheus的核心设计
c++
An_s5 小时前
c++对接pdfium(一)win系统篇
开发语言·c++
众少成多积小致巨5 小时前
C++ 规范参考(上)
c++
QXWZ_IA6 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel6 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客6 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化