Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34072 张老师 【S】T1 C++ 通过 100 651 MS 4180 KB 1501 2024-11-03 14:24:23

Tests(10/10):


#include<bits/stdc++.h> using namespace std; int t,n,k,a[500009],cnt[500009]; int qs[500009],qb[500009]; inline int read(){ int s = 0,w = 1; char ch = getchar(); while (ch > '9' || ch < '0'){ if (ch == '-') w = -1; ch = getchar();} while (ch <= '9' && ch >= '0') s = (s << 1) + (s << 3) + (ch ^ 48),ch = getchar(); return s * w; } int main(){ t = read(); while (t --){ n = read(),k = read(); for (int i = 1;i <= n;i += 1) a[i] = read(),cnt[i] = 0; int xans = 2e9,lans = 0,hs = 1,ts = 0,hb = 1,tb = 0,r = 0; for (int i = 1;i <= n;i += 1){ while (ts >= hs && i - qs[hs] > n - k) hs += 1; while (tb >= hb && i - qb[hb] > n - k) hb += 1; while (ts >= hs && a[i] < a[qs[ts]]) ts -= 1; while (tb >= hb && a[i] > a[qb[tb]]) tb -= 1; qs[++ ts] = i,qb[++ tb] = i; if (i >= n - k + 1) xans = min(xans,a[qb[hb]] - a[qs[hs]]); } hs = 1,ts = 0,hb = 1,tb = 0; for (int i = 1;i <= n;i += 1){ while (ts >= hs && qs[hs] < i) hs += 1; while (tb >= hb && qb[hb] < i) hb += 1; while (r < n && (ts < hs || tb < hb || a[qb[hb]] - a[qs[hs]] < xans)){ r += 1; while (ts >= hs && a[r] < a[qs[ts]]) ts -= 1; while (tb >= hb && a[r] > a[qb[tb]]) tb -= 1; qs[++ ts] = r,qb[++ tb] = r; } if (a[qb[hb]] - a[qs[hs]] < xans) break; cnt[r - i + 1] += 1,cnt[n - i + 2] -= 1; } for (int i = 1;i <= n;i += 1) cnt[i] += cnt[i - 1]; while (cnt[lans] < k) lans += 1; printf("%d %d\n",xans,lans); } return 0; }


测评信息: