P1886 滑动窗口

现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

例如:

The array is [1 3 -1 -3 5 3 6 7], and k = 3.

输入输出格式

输入格式:

输入一共有两行,第一行为n,k。

第二行为n个数(<INT_MAX).

输出格式:

输出共两行,第一行为每次窗口滑动的最小值

第二行为每次窗口滑动的最大值

输入输出样例

输入样例#1:

8 3
1 3 -1 -3 5 3 6 7

输出样例#1:

-1 -3 -3 -3 3 3
3 3 5 5 6 7

说明

50%的数据,n<=10^5

100%的数据,n<=10^6

 1 //#pragma GCC optimize("O1")
 2 //#pragma GCC optimize("O2")
 3 //#pragma GCC optimize("O3")
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<iostream>
 7 #include<algorithm>
 8 #include<ctime>
 9 #include<cmath>
10 #include<vector>
11 #include<queue>
12 //#include<stack>
13 //#include<map>
14 #define R(a,b,c) for(register int (a)=(b);(a)<=(c);++(a))
15 #define nR(a,b,c) for(register int (a)=(b);(a)>=(c);--(a))
16 #define Ii inline int
17 #define Iv inline void
18 #define Il inline long long
19 #define Ib inline bool
20 #define INF 0x3f3f3f3f
21 #define re register
22 #define ll long long
23 #define Max(a,b) ((a)>(b)?(a):(b))
24 #define Min(a,b) ((a)<(b)?(a):(b))
25 template<class Tp>Iv Cmax(Tp &a,Tp b){((a)=(a)>(b)?(a):(b));}
26 template<class Tp>Iv Cmin(Tp &a,Tp b){((a)=(a)<(b)?(a):(b));}
27 #define Fill(a,b) memset((a),(b),sizeof((a)))
28 #define D_e_Line printf("\n-------------\n");
29 #define D_e(x) printf("\n______%d_______\n",x)
30 #define Pause system("pause")
31 #define lson l,mid,rt<<1
32 #define rson mid+1,r,rt<<1|1
33 using namespace std;
34 const int N=1000005;
35 Ii read(){
36     int s=0,f=1;char c;
37     for(c=getchar();c>'9'||c<'0';c=getchar())if(c=='-')f=-1;
38     while(c>='0'&&c<='9')s=s*10+(c^'0'),c=getchar();
39     return s*f;
40 }
41 template<class Tp>Iv print(Tp x){
42     if(x<0)putchar('-'),x=-x;
43     if(x>9)print(x/10);
44     putchar(x%10^'0');
45 }
46 int t_max[N<<2],t_min[N<<2];
47 Iv pushup(int rt){
48     t_max[rt]=Max(t_max[rt<<1],t_max[rt<<1|1]),
49     t_min[rt]=Min(t_min[rt<<1],t_min[rt<<1|1]);
50 }
51 Iv updata(int x,int w,int l,int r,int rt){
52     if(l==r){t_max[rt]+=w,t_min[rt]+=w;return;}
53     int mid=l+r>>1;
54     x<=mid?updata(x,w,lson):updata(x,w,rson) ;
55     pushup(rt);
56 }
57 Ii query_max(int L,int R,int l,int r,int rt){
58     if(L<=l&&r<=R)return t_max[rt];
59     int mid=l+r>>1,maxium=-INF;
60     if(L<=mid)Cmax(maxium,query_max(L,R,lson));
61     if(R>mid)Cmax(maxium,query_max(L,R,rson));
62     return maxium;
63 }
64 Ii query_min(int L,int R,int l,int r,int rt){
65     if(L<=l&&r<=R)return t_min[rt];
66     int mid=l+r>>1,minium=INF;
67     if(L<=mid)Cmin(minium,query_min(L,R,lson));
68     if(R>mid)Cmin(minium,query_min(L,R,rson));
69     return minium;
70 }
71 int main(){
72     int n=read(),K=read();
73     R(i,1,n)
74         updata(i,read(),1,n,1);
75     int l=1,r=K;
76     while(1){
77         printf("%d ",query_min(l,r,1,n,1));
78         ++l,++r;
79         if(r>n)break;
80     }
81     putchar('\n');
82     l=1,r=K;
83     while(1){
84         printf("%d ",query_max(l,r,1,n,1));
85         ++l,++r;
86         if(r>n)break;
87     }
88     return 0;
89 }

SegmentTree_80.cpp

 1 //#pragma GCC optimize("O1")
 2 //#pragma GCC optimize("O2")
 3 //#pragma GCC optimize("O3")
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<iostream>
 7 #include<algorithm>
 8 #include<ctime>
 9 #include<cmath>
10 //#include<vector>
11 //#include<queue>
12 //#include<stack>
13 //#include<map>
14 #define R(a,b,c) for(register int (a)=(b);(a)<=(c);++(a))
15 #define nR(a,b,c) for(register int (a)=(b);(a)>=(c);--(a))
16 #define Ii inline int
17 #define Iv inline void
18 #define Il inline long long
19 #define Ib inline bool
20 #define INF 0x3f3f3f3f
21 #define re register
22 #define ll long long
23 #define Max(a,b) ((a)>(b)?(a):(b))
24 #define Min(a,b) ((a)<(b)?(a):(b))
25 template<class Tp>Iv Cmax(Tp &a,Tp b){((a)=(a)>(b)?(a):(b));}
26 template<class Tp>Iv Cmin(Tp &a,Tp b){((a)=(a)<(b)?(a):(b));}
27 #define Fill(a,b) memset((a),(b),sizeof((a)))
28 #define D_e_Line printf("\n-------------\n");
29 #define D_e(x) printf("\n______%d_______\n",x)
30 #define Pause system("pause")
31 #define lson l,mid,rt<<1
32 #define rson mid+1,r,rt<<1|1
33 using namespace std;
34 const int N=1000005;
35 Ii read(){
36     int s=0,f=1;char c;
37     for(c=getchar();c>'9'||c<'0';c=getchar())if(c=='-')f=-1;
38     while(c>='0'&&c<='9')s=s*10+(c^'0'),c=getchar();
39     return s*f;
40 }
41 template<class Tp>Iv print(Tp x){
42     if(x<0)putchar('-'),x=-x;
43     if(x>9)print(x/10);
44     putchar(x%10^'0');
45 }
46 int t_max[N<<2],t_min[N<<2];
47 int M;
48 Iv Build(int n){
49     for(M=1;M<=n+1;M<<=1);
50 }
51 Iv updata(int n,int w){
52     int tmp=n;
53     for(t_max[n+=M]+=w,n>>=1;n;n>>=1)
54         t_max[n]=Max(t_max[n<<1],t_max[n<<1|1]);
55     n=tmp;
56     for(t_min[n+=M]+=w,n>>=1;n;n>>=1)
57         t_min[n]=Min(t_min[n<<1],t_min[n<<1|1]);
58 }
59 Ii query_max(int s,int t){
60     int ans=-INF;
61     for(s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1){
62         if(~s&1)Cmax(ans,t_max[s^1]);
63         if(t&1)Cmax(ans,t_max[t^1]);
64     }
65     return ans;
66 }
67 Ii query_min(int s,int t){
68     int ans=INF;
69     for(s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1){
70         if(~s&1)Cmin(ans,t_min[s^1]);
71         if(t&1)Cmin(ans,t_min[t^1]);
72     }
73     return ans;
74 }
75 int main(){
76     int n=read(),K=read();
77     Build(n);
78     R(i,1,n)
79         updata(i,read());
80     int l=1,r=K;
81     while(1){
82         printf("%d ",query_min(l,r));
83         ++l,++r;
84         if(r>n)break;
85     }
86     putchar('\n');
87     l=1,r=K;
88     while(1){
89         printf("%d ",query_max(l,r));
90         ++l,++r;
91         if(r>n)break;
92     }
93     return 0;
94 }

SegmentTree_ZKW_100.cpp

PS: POJ TLE

转载于:https://www.cnblogs.com/bingoyes/p/10338293.html

Luogu P1886 滑动窗口相关推荐

  1. 洛谷 - P1886 滑动窗口(单调队列/线段树)

    题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...

  2. P1886 滑动窗口(求连续区间最值的O(N)解法,单调队列)

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  3. 洛谷 P1886 滑动窗口

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  4. P1886 滑动窗口 /【模板】单调队列

    展开 题目描述 有一个长为 nn 的序列 aa,以及一个大小为 kk 的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array is [ ...

  5. leetcode 30. Substring with Concatenation of All Words 与所有单词相关联的字串 滑动窗口法

    题目描述 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. You are given a string, s, and a ...

  6. leetcode 567. Permutation in String 字符串的排列 滑动窗口法

    题目 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列.换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1:输入: s1 = "ab" s ...

  7. leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法

    题目解析 代码如下 题目解析 这一题是一道会员的题目,题目介绍如下: Given a string, find the length of the longest substring T that c ...

  8. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法

    题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...

  9. leetcode 438. Find All Anagrams in a String 滑动窗口法

    题目链接 解析 主要使用滑动窗口法解题,需要好好体会的是中间的两个判断couter的用法,这里很巧妙. 如果想了解更多的滑动窗口法内容,看这里: 滑动窗口法详解 代码 from collections ...

最新文章

  1. SAP PM入门系列30 - IW39 Display Orders
  2. 标准粒子群算法(PSO)及其Matlab程序和常见改进算法
  3. SENet双塔模型:在推荐领域召回粗排的应用及其它
  4. 推荐一款文件搜索神器Everything!
  5. 让同步函数同步执行,异步函数异步执行,并且让它们具有统一的 API
  6. 架构大型企业Java项目–我的虚拟JUG会话
  7. Python之字符串转换为日期、结合时区的日期操作
  8. C++ 判断元音/辅音
  9. android实现号码归属地,Android 如何获取手机号码归属地
  10. 3D图像线性插值算法实现
  11. 淘宝购物流程图 基本流和备选流以及测试用例
  12. chromium下载历史版本错误
  13. Linux头文件 C/C++头文件
  14. win7/ubuntu18 双系统安装和卸载
  15. 关于机器学习,我总结了可能是目前最全面最无痛的入门路径和资源!
  16. jsp:通过Session控制登陆时间和内部页面的访问
  17. 什么是大数据,大数据最缺什么样的人才?
  18. iiOS 6 新特性
  19. java中display1,CSS Display(显示)
  20. 福师计算机网考,福师网院20春计算机应用基础考核答案

热门文章

  1. iOS UITouch 触摸事件处理
  2. hdu4525 威威猫系列故事——吃鸡腿
  3. Oracle内部错误:ORA-00600[2608]一例
  4. ubuntu下小键盘不能用
  5. Android开发——Android Studio中配置及使用OpenCV示例
  6. 给ADAS泼冷水?不,是客观评价
  7. 【开源】Caffe、TensorFlow、MXnet三个开源库对比
  8. CSS 选择器参考手册
  9. Spring Cloud - 服务消费者Ribbon
  10. Can't read [proguard.ClassPathEntry@1a0c10f] (No such file or directory)