poj2823/hdu3415 - 数据结构 单调队列
长度为N的数组,求宽度k的滑动窗口在数组上滑动时窗口内的最大值或最小值
如果用单调队列做,求最小值时,队列应该严格递增的。所以插入时,队尾大于等于插入值的元素都应被舍弃,因为插入元素不仅小而且新,没有必要保留队尾这些又大又旧的元素。
- /*
选C++交是5k多毫秒,但是G++就会超时。
*/
#include <cstdio>- #include <cstring>
- const int N = ;
- int data[N];
- int o1[N],o2[N];
- int q[N];
- int n,k;
- void getMin(){
- int head,tail;
- head = tail = ;
- for(int i=;i<n;i++){
- while((tail>head)&&data[q[tail-]]>data[i]) tail--;
- q[tail++] = i;
- if(i>=(k-)){
- while((head<tail)&&q[head]<(i-k+)) head++;
- o1[i-k+] = data[q[head]];
- }
- }
- }
- void getMax(){
- int head,tail;
- head = tail = ;
- for(int i=;i<n;i++){
- while((head<tail)&&(data[q[tail-]]<data[i])) tail--;
- q[tail++] = i;
- if(i>=(k-)){
- while((head<tail)&&(q[head]<(i-k+))) head++;
- o2[i-k+] = data[q[head]];
- }
- }
- }
- int main(){
- scanf("%d%d",&n,&k);
- for(int i=;i<n;i++) scanf("%d",data+i);
- getMin();
- getMax();
- for(int i=;i<n-k+;i++) printf("%d ",o1[i]); puts("");
- for(int i=;i<n-k+;i++) printf("%d ",o2[i]); puts("");
- return ;
- }
长度为N的数组,长度小于等于K的非空子串的最大和。
求完前缀和后就转化成了窗宽为k的单调队列
- #include <cstdio>
- #include <cstring>
- const int N = ;
- const int INF = 0x0FFFFFFF;
- int data[N],sum[N*];
- int q[N*];
- int n,k,total;
- int minq(int &spos,int &epos){
- int head,tail;
- head = tail = ;
- int ans = -INF;
- for(int i=;i<total;i++){
- while((head<tail)&&(sum[q[tail-]]>=sum[i-])) tail--;
- while((head<tail)&&q[head]<i-k) head++;
- q[tail++] = i-;
- if((sum[i]-sum[q[head]]>ans)){
- spos = q[head];
- epos = i;
- ans = sum[epos]-sum[spos];
- }
- }
- return ans;
- }
- int main(){
- int t;
- for(scanf("%d",&t);t--;){
- scanf("%d%d",&n,&k);
- sum[] = ;
- for(int i=;i<=n;i++){
- scanf("%d",data+i);
- sum[i]=sum[i-]+data[i];
- }
- for(int i=;i<k;i++) sum[n+i]=sum[n+i-]+data[i];
- total = n+k;
- int spos,epos;
- int ans = minq(spos,epos);
- spos++;
- if(epos>n) epos-=n;
- if(spos>n) spos-=n;
- printf("%d %d %d\n",ans,spos,epos);
- }
- return ;
- }
poj2823/hdu3415 - 数据结构 单调队列的更多相关文章
- POJ2823 Sliding Window(单调队列)
单调队列,我用deque维护.这道题不难写,我第二次写单调队列,1次AC. -------------------------------------------------------------- ...
- hdu3415(单调队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3415 题意:一个长度为n包含正负整数的数环,即第1个的左边是第n个.从中选一个不超过k的序列,使得序列 ...
- poj2823一道纯单调队列
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 32099 Accepted: 9526 ...
- HDU3415【单调队列】
单调队列解决通过维护满足条件内的值,并保证队列里的值单调,解决一个最大最小. 让你求一个k区间长度的最大值,那么就只要搞下前缀和, sum[ i , j ] 区间的和:sum[ j ]-sum[ i ...
- poj2823:单调队列入门题
今天学习了一下单调队列这种数据结构,思想不是很难 参考资料:http://www.cnblogs.com/Jason-Damon/archive/2012/04/19/2457889.html 然后自 ...
- POJ2823 单调队列
POJ2823 http://poj.org/problem?id=2823 最基础的单调队列,说是数据结构,其实就是一种更新数组数据的方法. 之前还准备用deque,超时了,直接head,tail快 ...
- POJ2823 Sliding Window (单调队列)
POJ2823 Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 38342 Accepte ...
- 数据结构录 之 单调队列&单调栈。
队列和栈是很常见的应用,大部分算法中都能见到他们的影子. 而单纯的队列和栈经常不能满足需求,所以需要一些很神奇的队列和栈的扩展. 其中最出名的应该是优先队列吧我觉得,然后还有两种比较小众的扩展就是单调 ...
- poj2823 单调队列初步
什么是单调队列:头元素一直是队列当中的最大值,队列中的值按照递减顺序排列,可以从末尾插入一个元素,或从两段删除元素 1.插入元素,为了保证队列的单调性(这里假设为递减性),在插入元素v时要将对位的元素 ...
随机推荐
- WebRTC代码走读(八):代码文件夹结构
转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包含线程.锁.socket等 ├── ./build //编译脚本.gyp ├── ./ ...
- Find Blank Cell in Excel
Click Home > Find & Select > Go To Special. In the Go To Special dialog box, check the Bla ...
- JavaScript学习记录一
title: JavaScript学习记录一 toc: true date: 2018-09-11 18:26:52 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- Linux部署之批量自动安装系统之测试篇
1. 客户端从网络启动如下 2. 复制vesamenu.c32文件可解决上面的问题 3. 客户端再次启动 4. 选择第一个进 ...
- map循环遍历
data.map(function(item){ item.show = false; //将拿到的data循环给每一项添加show属性 });
- 【BZOJ4071】【APIO2015】巴邻旁之桥
题意: Description 一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B. 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 1 ...
- UVA-10003 Cutting Sticks 动态规划 找分界点k的动规
题目链接:https://cn.vjudge.net/problem/UVA-10003 题意 有根棍子,上面有些分割点(n<50),每次按分割点切割棍子时,费用为当前棍子的长度. 问有什么样的 ...
- HDU-5685 Problem A 求乘法逆元
题目链接:https://cn.vjudge.net/problem/HDU-5685 题意 给一个字符串S和一个哈希算法 $ H(s)=\prod_{i=1}^{i\leq len(s)}(S_{i ...
- 第一个JavaWeb工程
这个工程主要用来研究log4j,所以就只有一个页面,希望以后慢慢进步. java动态生成网页主要使用servlet.把请求拦截下来,处理后返回结果. 这里创建的是一个maven工程. 结构如下:
- 解决jquery动态增加元素后children值没有变的问题
html代码如下: <ul id="attr_input_panel"> <li> <div class="attr_input_item& ...