P1886 滑動視窗

2022-08-02 06:15:11 字數 2420 閱讀 9225

題意::::現在有一堆數字共n個數字(n<=10^6),以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。

解法  1)單調佇列   2)線段樹(n * log n)

單調佇列分析::

考慮最小值情況::

以該樣例為例子說明::: 

8 31 3 -1 -3 5 3 6 7(在這裡非常巧妙的就是用下標來維護視窗大小,保證均在合理範圍內不越界)

q表示隊列入隊的為下標

1:隊空 1 直接 入隊 q=; 3 也直接入隊 q=;-1 則彈出前兩項 q=;

2:  -3 則彈出前一項 q=; 5 直接入隊 q=; 3 則彈出前一項 q=;同時 隊頭下次操作越界 所以pop q=;

3:6 直接入隊 q=; 7 也直接入隊 q=;同時 隊頭下次操作越界 所以pop q=;

1):當佇列非空且隊尾指向的下標元素小於當前或等於當前值---->不斷彈出隊尾

2):下標入隊尾

3):判斷隊頭所指向的下標是否越界,是則 pop

最大值情況同樣考慮\

1 #include 2

#define ll long long

3const

int maxn=1e6+5;4

using

namespace

std;56

intma[maxn];

7int

a[maxn],b[maxn];

8 dequeq;

9int

main()

1016

//最小值

17for(int i=1;i<=n;i++)

1822

q.push_back(i);

23 a[i]=ma[q.front()];

24if(q.front()<=i-k+1&&i>=k)27}

2829

while(!q.empty())

3033

for(int i=1;i<=n;i++)

3438

q.push_back(i);

39 b[i]=ma[q.front()];

40if(q.front()<=i-k+1&&i>=k)43}

44for(int i=k;i<=n;i++)

47 printf("\n"

);48

for(int i=k;i<=n;i++)

51return0;

52 }

線段樹更容易理解就不解釋了,貼** (ac 900+ms  時間看著很慌,資料好點估計會卡死)

1 #include2

#define ll long long

3const

int mod=1e9+7;4

using

namespace

std;

5const

int maxn=1e6+5;6

7int min[4*maxn],a[maxn],max[4*maxn];

8int

ma[maxn],mb[maxn];910

void pushup(int

rt)11

15void build(int l,int r,int

rt)16

22int mid=(l+r)>>1

;23 build(l,mid,2*rt);

24 build(mid+1,r,2*rt+1

);25

pushup(rt);26}

2728

int query1(int l,int r,int l,int r,int

rt)29

33int mid=(l+r)>>1;34

int ans=-1e9;

35if(l<=mid)

38if(r>mid)

41return

ans;42}

43int query2(int l,int r,int l,int r,int

rt)44

48int mid=(l+r)>>1;49

int ans=1e9;

50if(l<=mid)

53if(r>mid)

56return

ans;57}

58int

main()

5965 build(1,n,1

);66

for(int i=1;i<=n-m+1;i++)

6771

for(int i=1;i<=n-m+1;i++)

74 printf("\n"

);75

for(int i=1;i<=n-m+1;i++)

78return0;

79 }

P1886 滑動視窗

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出格式 輸出...

P1886 滑動視窗

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.輸入格式 輸入一共有兩行,第一行為n,k。第二行為n個數 輸出共兩行,第...

P1886 滑動視窗

有乙個長為n的序列a,以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1,3,1,3,5,3,6,7 and k 3。輸入格式 輸入一共有兩行,第一行有兩個正整數 n,kn,k。第二行 nn 個整數,表示序列...