題意::::現在有一堆數字共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 個整數,表示序列...