【ST表】【单调队列】Window(jzoj 1326)
生活随笔
收集整理的這篇文章主要介紹了
【ST表】【单调队列】Window(jzoj 1326)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Window
jzoj 1326
題目大意
給你一個(gè)序列a和一個(gè)數(shù)k,讓你求a中所有長(zhǎng)為k的子序列的最大值和最小值
輸入樣例
8 3 1 3 -1 -3 5 3 6 7輸出樣例
-1 -3 -3 -3 3 3 3 3 5 5 6 7數(shù)據(jù)范圍
2020%: n\leqslant 500; 50%: n\leqslant 100000;20
100100%: n\leqslant 1000000;100
解題思路
方法一:
滾動(dòng)ST表(不多做解釋)
代碼1:
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int n, k, m, r, f[2][1000010], mf[2][1000010]; int main() {memset(mf, 127/3, sizeof(mf));memset(f, -127/3, sizeof(f));scanf("%d %d", &n, &k);for (int i = 1; i <= n; ++i){scanf("%d", &f[0][i]);mf[0][i] = f[0][i];}m = log2(k);for (int j = 1; j <= m; ++j){memset(mf[j&1], 127/3, sizeof(mf[j&1]));//滾動(dòng)memset(f[j&1], -127/3, sizeof(f[j&1]));for (int i = 1; i <= n - (1<<j) + 1; ++i){f[j&1][i] = max(f[(j + 1)&1][i], f[(j + 1)&1][i + (1<<(j - 1))]);//st表mf[j&1][i] = min(mf[(j + 1)&1][i], mf[(j + 1)&1][i + (1<<(j - 1))]);} }for (int i = 1; i <= n - k + 1; ++i){r = i + k - 1;printf("%d ", min(mf[m&1][i], mf[m&1][r - (1<<m) + 1]));//求解}putchar(10);for (int i = 1; i <= n - k + 1; ++i){r = i + k - 1;printf("%d ", max(f[m&1][i], f[m&1][r - (1<<m) + 1]));}return 0; }方法二:
我們用單調(diào)隊(duì)列來(lái)存最大/小值,如果不是更優(yōu)的就丟掉,如果超過(guò)了也丟掉
代碼
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; int n, m, tail, head, h[1000100], a[1000100]; int main() {scanf("%d %d", &n, &m);tail = 0;head = 1;for (int i = 1; i <= n; ++i){scanf("%d", &a[i]);if (head <= tail && h[head] < i - m + 1) head++;//如果過(guò)了那就丟掉while(head <= tail && a[h[tail]] > a[i]) tail--;//如果比前面的小,那前面的丟掉h[++tail] = i;//存進(jìn)去if (i >= m) printf("%d ", a[h[head]]);//這樣下來(lái)最前面的就是最小的}tail = 0;head = 1;putchar(10);for (int i = 1; i <= n; ++i)//同上{if (head <= tail && h[head] < i - m + 1) head++;while(head <= tail && a[h[tail]] < a[i]) tail--;h[++tail] = i;if (i >= m) printf("%d ", a[h[head]]);}return 0; }總結(jié)
以上是生活随笔為你收集整理的【ST表】【单调队列】Window(jzoj 1326)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新品首降 590 元:天龙 PerL P
- 下一篇: 【DP】Mobile Service(j