Luogu P1886 滑动窗口
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).
输出格式:
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值
输入输出样例
8 3 1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3 3 3 5 5 6 7
说明
50%的数据,n<=10^5
100%的数据,n<=10^6
![](/assets/blank.gif)
![](/assets/blank.gif)
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
![](/assets/blank.gif)
![](/assets/blank.gif)
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 滑动窗口相关推荐
- 洛谷 - P1886 滑动窗口(单调队列/线段树)
题目链接:点击查看 题目大意:给出一个由n个数构成的序列,再给出一个长度为k的窗口,这个窗口从第一个下标开始一直向后移动,每次移动一个单位,每次移动询问一次该窗口中的最大值和最小值,最后输出答案 题目 ...
- P1886 滑动窗口(求连续区间最值的O(N)解法,单调队列)
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- 洛谷 P1886 滑动窗口
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- P1886 滑动窗口 /【模板】单调队列
展开 题目描述 有一个长为 nn 的序列 aa,以及一个大小为 kk 的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array is [ ...
- leetcode 30. Substring with Concatenation of All Words 与所有单词相关联的字串 滑动窗口法
题目描述 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. You are given a string, s, and a ...
- leetcode 567. Permutation in String 字符串的排列 滑动窗口法
题目 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列.换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1:输入: s1 = "ab" s ...
- leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法
题目解析 代码如下 题目解析 这一题是一道会员的题目,题目介绍如下: Given a string, find the length of the longest substring T that c ...
- leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法
题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...
- leetcode 438. Find All Anagrams in a String 滑动窗口法
题目链接 解析 主要使用滑动窗口法解题,需要好好体会的是中间的两个判断couter的用法,这里很巧妙. 如果想了解更多的滑动窗口法内容,看这里: 滑动窗口法详解 代码 from collections ...
最新文章
- SAP PM入门系列30 - IW39 Display Orders
- 标准粒子群算法(PSO)及其Matlab程序和常见改进算法
- SENet双塔模型:在推荐领域召回粗排的应用及其它
- 推荐一款文件搜索神器Everything!
- 让同步函数同步执行,异步函数异步执行,并且让它们具有统一的 API
- 架构大型企业Java项目–我的虚拟JUG会话
- Python之字符串转换为日期、结合时区的日期操作
- C++ 判断元音/辅音
- android实现号码归属地,Android 如何获取手机号码归属地
- 3D图像线性插值算法实现
- 淘宝购物流程图 基本流和备选流以及测试用例
- chromium下载历史版本错误
- Linux头文件 C/C++头文件
- win7/ubuntu18 双系统安装和卸载
- 关于机器学习,我总结了可能是目前最全面最无痛的入门路径和资源!
- jsp:通过Session控制登陆时间和内部页面的访问
- 什么是大数据,大数据最缺什么样的人才?
- iiOS 6 新特性
- java中display1,CSS Display(显示)
- 福师计算机网考,福师网院20春计算机应用基础考核答案
热门文章
- iOS UITouch 触摸事件处理
- hdu4525 威威猫系列故事——吃鸡腿
- Oracle内部错误:ORA-00600[2608]一例
- ubuntu下小键盘不能用
- Android开发——Android Studio中配置及使用OpenCV示例
- 给ADAS泼冷水?不,是客观评价
- 【开源】Caffe、TensorFlow、MXnet三个开源库对比
- CSS 选择器参考手册
- Spring Cloud - 服务消费者Ribbon
- Can't read [proguard.ClassPathEntry@1a0c10f] (No such file or directory)