文章

24

粉丝

27

获赞

126

访问

11.3k

头像
排列删除 题解:
P5276 华东师范大学2024年机试题
发布于2025年3月19日 17:16
阅读数 477

首先i为1可以删,也就是这个序列可以一直删第一个,那么只要x<y,可以无脑从1开始删,x必然比y先删掉,只需考虑y<x情况

或者p[i-1]>p[i]可以删,也就是左边邻居比自己大,自己就可以删。因此y<x时最简单思路就是可以考虑求区间[y,x)最大值,

这个最大值右侧的一切数都比它小,可以先删它右侧的,这样右侧就少了一个数,它又有了新的右邻居,一个接一个删没,当然也包括p[x]。

c++有求区间最大值库函数的,max_element(p+y, p+x),但是这个复杂度是O(n),在循环中放一个这个会超时,需要考虑如何优化

思路就是不必求最大值,只要从x-1往前遍历到y,发现一个比p[x]大的立即结束,因为这样已经可以保证p[x]可先删除了,首先它是第一个发现的比p[x]大的数

那么它右侧其他数都比p[x]小,自然比这个比p[x]还大的小,可以一个接一个删掉,然后就剩p[x],也比它小,自然可删。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n,q,x,y;
int p[N];

bool check(int x,int y){
    if(x<y) return true;
    else{
        for(int i=x-1;i>=y;i--)
            if(p[i]>p[x]) return true;
        return false;
    }
}
int main() {
    scanf("%d",&n);
    for (int i = 1; i <= n; i ++) 
    scanf("%d",&p[i...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发