评论区的大佬个个都是人才,说话又好听
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
// Write your code here
while(line = await readline()){
const t = +line
for(let i = 0; i < t; i++) {
const [n, m] = (await readline()).split(' ').map(Number)
const a = (await readline()).split(' ').map(Number)
// a中一定不能有重复的数,否则不可能单调
const seen = new Set(a)
if(seen.size !== n) {
console.log('NO')
continue
}
let isValid = false
// 遍历每个[l, r]区间,判断:
// 1.[l, r]区间单调
// 2.[l, r]区间外的元素满足 x > max 或 x < min,(min,max为区间的最大和最小值)
let l = 0, r = m - 1
while(r < n) {
const nums = a.slice(l, r + 1)
let max = nums[0]
let min = nums[0]
let upFlag = true
let downFlag = true
for(let i = 0; i <= r - l; i++) {
if(i < r - l && nums[i] >= nums[i + 1]) {
upFlag = false // 非递增
}
if(i < r - l && nums[i] <= nums[i + 1]) {
downFlag = false // 非递减
}
max = Math.max(nums[i], max)
min = Math.min(nums[i], min)
}
if(!upFlag && !downFlag) {
// 区间非递增或者非递减
l++
r++
continue
}
// 获取[l, r]区间外的元素
const front = a.slice(0, l)
const tail = a.slice(r + 1)
// console.log(front, min)
// console.log(tail, max)
if(front.every(num => num > max || num < min) &&
tail.every(num => num > max || num < min)) {
// 满足条件
console.log('YES')
isValid = true
break
}
l++
r++
}
if(!isValid)
console.log('NO')
}
}
}()

京公网安备 11010502036488号