穷酸博主没有bz权限号, 也不会去$poi$官网, 在某咕刷的$poi$,按照某咕的难度排序刷, poi~
$Luogu3572 PTA-Little Bird$
单调队列, 队列内按照 步数为第一关键字递增, 高度为第二关键字递减
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define rd read() 5 #define R register 6 #define N 1000005 7 using namespace std; 8 9 int n, k, Q; 10 int d[N], f[N], q[N]; 11 12 inline int read() { 13 int X = 0, p = 1; char c = getchar(); 14 for (; c > '9' || c < '0';c = getchar()) 15 if (c == '-') p = -1; 16 for (; c >= '0' && c <= '9'; c = getchar()) 17 X = X * 10 + c - '0'; 18 return X * p; 19 } 20 21 int main() 22 { 23 n = rd; 24 for (R int i = 1; i <= n; ++i) d[i] = rd; 25 Q = rd; 26 for (; Q; Q--) { 27 k = rd; 28 int l = 1, r = 1; 29 q[l] = 1; 30 for (R int i = 2; i <= n; ++i) { 31 while (l <= r && q[l] < i - k) l++; 32 f[i] = f[q[l]] + (d[q[l]] <= d[i] ? 1 : 0); 33 while (l <= r && (f[q[r]] > f[i] || (f[q[r]] == f[i] && d[q[r]] <= d[i]))) r--; 34 q[++r] = i; 35 } 36 printf("%d\n", f[n]); 37 } 38 }