文章
24
粉丝
27
获赞
126
访问
11.3k
首先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...
登录后发布评论
暂无评论,来抢沙发