E题题解 | #而后单调#

首先数组中的元素不能有重复的,否则不可能达到严格递增或严格递减。

我们可以任意重排没有被选择的元素,所以被选中的个元素一定是严格递增或严格递减, 且没有其他数据满足(即其余元素中没有元素在被选择的元素的最大值和最小值之间)

我们可以对离散化处理,这样满足要求的元素一定是连续的()

from bisect import bisect_left

def check1(a, m):
    n = len(a)
    mm = -1 # 严格递增且连续的子数组的最大长度
    l = 0
    for r in range(1, n):
        if a[r] != a[r-1] + 1:
            mm = max(r-l, mm)
            l = r
            
    mm = max(n-l, mm)
    return mm >= m

def check2(a, m):
    n = len(a)
    mm = -1 # 严格递减且连续的子数组的最大长度
    l = 0
    for r in range(1, n):
        if a[r] != a[r-1] - 1:
            mm = max(r-l, mm)
            l = r        
    mm = max(n-l, mm)
    return mm >= m

t = int(input())
for _ in range(t):
    n, m = map(int, input().split())
    a = list(map(int, input().split()))
    if len(set(a)) != n: # 有重复元素
        print('NO')
        continue
        
    if n == 1 or m == 1: # 没有重复元素的情况下,若只有一个元素或者m为1,则一定能满足
        print('YES')
        continue
    
    #对a离散化处理
    na = a[:]
    na.sort()
    for i in range(n):
        a[i] = bisect_left(na, a[i])
    
    if check1(a, m) or check2(a, m):
        print("YES")
    else:
        print("NO")
全部评论
#include<iostream> #include<algorithm> #include<vector> #define IOS ios::sync_with_stdio(0);cin.tie(0), cout.tie(0); using namespace std; const int N = 2e5 + 10; int T; bool check1(vector<int> &a, int m) { int ll = 0, len = -1; for(int i = 1; i < a.size(); ++ i) if(a[i] != a[i - 1] + 1) { len = max(len, i - ll); ll = i; } len = max(len, int(a.size()) - ll); return len >= m; } bool check2(vector<int> &a, int m) { int ll = 0, len = -1; for(int i = 1; i < a.size(); ++ i) if(a[i] != a[i - 1] - 1) { len = max(len, i - ll); ll = i; } len = max(len, int(a.size()) - ll); return len >= m; } signed main() { IOS cin >> T; while(T--) { int n, m; cin >> n >> m; vector<int> a(n); for(int i = 0; i < n; ++ i) cin >> a[i]; if(n != int(unique(a.begin(), a.end()) - a.begin())) { cout << "NO\n"; continue; } if(n == 1 || m == 1) { cout << "YES\n"; continue; } vector<int> ma = a; sort(ma.begin(), ma.end()); for(int i = 0; i < n; ++ i) a[i] = lower_bound(ma.begin(), ma.end(), a[i]) - ma.begin(); if(check1(a, m) || check2(a, m)) cout << "YES\n"; else cout << "NO\n"; } } 改成c++版代码部分数据就过不了,想知道为啥</int></int></int></int></vector></algorithm></iostream>
点赞 回复 分享
发布于 2024-12-30 19:25 河南

相关推荐

评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务