![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
队列
yzyyylx
这个作者很懒,什么都没留下…
展开
-
lightoj 1424 - New Land
题面题意 在一个01矩阵中找出最大的全为0的子矩阵。方法 首先预处理出每一个点从左到右连续0的个数,然后一列一列比较,找出以每一列为子矩形最后一列的最优结果(每一列的处理方法详见Histogram LightOJ - 1083),之后不断更新答案即可。 关键在于将此二维问题转化为一维的。代码#include<bits/stdc++.h>#define N 2010using原创 2017-10-24 22:38:17 · 341 阅读 · 0 评论 -
单调队列
解释 队首为一段区间的极值,可以通过不断地push来更新以push进去的数为末尾长度为k的最小值.实现方法 加入元素时,区间也在不断地向右移动,故若队首的位置小于区间的左端点,去掉队首. 或者当加入元素小于等于队首时(取区间最小值时),去掉队首,因为加入元素比队首小,且位置更靠后,后面还会有利用的机会,而队首左边的区间极值已经处理完毕,剩下的利用机会都和加入元素在一起,故去掉它毫无影原创 2017-10-24 10:22:43 · 201 阅读 · 0 评论 -
hdu4374 One hundred layer(单调队列维护dp)
题面题意 给出宽n,长m的矩阵,你一开始在第一行第k个,在每行你最多向左或向右移动t步(在底层和顶层皆可移动),移动后进入下一层,问到达底层后的最大分数是多少.方法 用dp思想可知,只需要知道到达每一点的最大得分是多少,若穷举每行的起点和终点进行状态转移,复杂度为O(n*m^2)必然TLE. 其实在第i行若终点为j,则起点必然在max(1,j-t)与min(m,j+t)之间,对于此类原创 2017-10-25 19:26:41 · 256 阅读 · 0 评论 -
HDU 3530 Subsequence
题面题意 多组数据 给n,k,m和n个数,问这n个数中最长满足其中最大值与最小值之差在m与k之间的子串的长度. n<=100000方法 因为n的范围和多组数据,必须用O(n)算法. 用单调队列来维护最大值和最小值,并据此dp 该单调队列使用时,将加入元素与队尾比较,根据维护的极值来判断比较规则,使队首表示的是该队列上一个pop的元素的位置右端到目前推入的元素的极原创 2017-10-24 20:20:30 · 241 阅读 · 0 评论 -
比赛6 总结
T1题面题意代码方法T2题面题意代码T3题面题意超时代码T4题面题意代码T1题面题意 输入n,输出两和为n的互质数且较小数最大代码#include<bits/stdc++.h>using namespace std;int main(){ int n,i; cin>>n; for(i=n/2;i>=1;i--) {原创 2017-09-08 12:08:36 · 236 阅读 · 0 评论 -
堆(优先队列)
优先队列简介作用代码优先队列简介 是一个完全二叉树(除最后一行外,其余部分为满二叉树),且父亲永远比孩子大或小。 用一个数组实现i的孩子为i*2和i*2+1,父亲为i/2。作用 1.迅速输出最大值,用pop输出数组的第一位 输出第一个,并把最后一个提上来,并比较使之合法 2.用——.push输入 先加到数组尾,再与父亲比较,过大则交换 3.用——.emp原创 2017-09-08 21:18:07 · 263 阅读 · 0 评论 -
比赛7 总结
T1题面题意 输入一个数,输出最多个质数,使和为该数。方法 尽量多打2,奇数则再加一个3.代码#include<bits/stdc++.h>using namespace std;int main(){ int n,i,k; cin>>n; k=n/2; if(n%2==1) { cout<<k<<endl<<3;原创 2017-09-09 12:01:11 · 217 阅读 · 0 评论 -
HDU5470 Typewriter
题面题意给出一个字符串,现在你要打印它,你有两种操作: 1.在已打印字符串后面打印一个字符,代价为该字母的代价。 2.选择已打印的字符串的一个子串s,在后面复制粘贴,代价为|S|*A+2*B。做法第一个操作很好处理,难点在于第二个操作。 首先考虑dp[i]表示打印前i个字母所需要的代价,这样dp[i]=min(dp[i-1]+need[i],dp[j]+(i-j)*A...原创 2018-07-28 12:55:58 · 692 阅读 · 0 评论