UVa 1618 弱键(Weak Key)

题意:
给出k个互不相同的整数组成的序列N,判断是否存在4个整数, Np,Nq,Nr,Ns (1<=p<q<r<s<=k) 使得 Nq > Ns > Np >Nr 或者 Nq < Ns < Np < Nr;

分析:
主要根据s p 来做选择 首先要保证 a[s] > a[p] 然后保证 a[q] > a[s] a[p] > a[r]
我们需要什么?
题目是说k的大小是3e5
很明显提示是 n^2 或者 nlogn 的算法
既然是n^2 的算法,就可以枚举所有的 s和p
可是,在需要 比s大的右边 和比p小的左边的时候 最坏又要n
这样n^3的算法会超时。
因此可以提前处理 找出 s大的右边 和p小的左边的位置,
同样是n^2
所以总的时间复杂度为 O(n^2)
注意翻转一下再算一次,因为题目可以或者~

代码:

#include<bits/stdc++.h>
#define LL long long
#define ms(s) memset(s, 0, sizeof(s))
using namespace std;
const int maxn = 5e3 + 10;
int a[maxn];
int p[maxn]; //right
int q[maxn]; //left
int n;

bool check() {
   
    memset(p, -1, sizeof(p));
    memset(q, -<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值