清北Day4
版权声明:如需转载请标明出处,未得到本人许可请勿转载。

今天就可以看到传说中的
数据结构
嘿嘿嘿嘿
都有什么呢
链表
队列
栈
st表
hash
线段树
树链剖分
一、栈:
放出来这个看烂了的图

值得一提的是栈的性质是先进后出!
那么:

简单粗暴直接上代码
int main()
{
r=;
while (Q--)
{
cin>>A;
)
{
cin>>B;
s[++r]=B; m[r]=max(m[r-],s[r]);
c[r]=c[r-]+s[r];
mc[r]=max(mc[r-],c[r]);
minc[r]=min(minc[r-],c[r]);
sum+=B;
}
) {r--; sum-=s[r]};
) cout<<m[r]<<endl;
) cout<<mc[r]<<endl;
) cout<<sum-minc[r]<<endl;
}
;
}
那么另一个更难一点的题

首先我们需要分析这个题。在光标的后面插入一个数字或者是删除光标签的最后一个数字都是栈的方式。左移和右移光标就比较值得分析,当光标在最左边或者是最右边的时候,光标左移就是不动的,当光标在最右边的时候,也是不动的,为了方便我们来求,可以把这个栈复制一遍放到后面,但并不合并,看成两个栈,栈尾接栈头那种,光标左移,左边的出栈,右边入栈,右移,左边入栈,右边出栈。求前缀和一个思路就是在入栈的时候直接加个sum求和就行。
那么下一道:

恩……这个题是一道dp题,结合了数据结构写得dp,是一道区间dp,首先需要知道的是,这个题可以枚举出栈序列最后一个是什么,有n个数,最后一个出栈的是k,(1,k-1)比(k+1,n)先出栈。
那么就需要解一下这个区间dp的情况,dp[l][r]指l~r这些数之间的方案总数。k∈(l,r)
dp[l][r] += Σdp[1][k-1]*dp[k+1][r]
ans = dp[1][n]
可以考虑枚举最后一个出栈的元素。分成两个相互独立的子问题,用DP就好
二、队列
继续按照规则,上一张特别特别老的图

请不要在意一些奇奇怪怪的边
那么队列的性质,先进先出
既然是队列,就要考虑所谓的front和rear,所以在队列中会有两个双指针,一个指向队首,一个队尾
但是实际上,队首是不能在队尾之后的,为了方便我们可以有循环队列。

那就来一道题愉快愉快吧

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
s[]
int main()
{
l=; r=;
while (Q--)
{
cin>>A;
)
{
cin>>B;
s[++r]=B;
}
) l++;
)
{
MAX=;
for (i=l; i<=r; i++)
MAX=max(MAX,s[i]);
cout<<MAX<<endl;
}
}
;
}
然后就可以讲一下单调队列了
这个可能拿函数的增减性会更好理解一些,在每次入队的时候,判断当前元素与队尾的大小关系,若小于队尾元素,则队尾不可能成为最小值,直接删除就好,但是如果要求最大值,直接输出队首元素即可,由于每个元素至多进队出队1次,所以就有时间复杂度:O(n)。
单调队列中都是有可能成为最大值的数
第i次插入的一定是第i次删除的。
O(Q)
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
s[]
int main()
{
l=; r=;
Q
Ql=; Qr=;
while (Q--)
{
cin>>A;
)
{
cin>>B;
while (Ql<=Qr && Q[Qr]<=B)
Qr--;
Q[++Qr]=B;
cnt++; P[Qr]=cnt;
}
)
{
CNT++;
if (P[Ql]==CNT) Ql++;
}
) cout<<Q[Ql]<<endl;
}
;
}
max{a1-x,a2-x,..,an-x}
max{a1,a2,..,an}-x
注意3738行的解释,这里每次把这个值减去x求所有数的最大值和先求出所有的最大值再减去x是一样的,还可以省去一个循环,小优化?
37 max{a1-x,a2-x,..,an- x}
38 max{a1,a2,..,an}-x
那就来一道题冷静一下吧

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
s[]
int main()
{
l=; r=;
Q
Ql=; Qr=;
while (Q--)
{
cin>>A;
)
{
cin>>B; sum+=B;
while (Ql<=Qr && Q[Qr]<=sum)
Qr--;
Q[++Qr]=sum;
cnt++; P[Qr]=cnt;
a[cnt]=sum;
}
)
{
CNT++; SUM+=a[CNT];
if (P[Ql]==CNT) Ql++;
}
) cout<<Q[Ql]-SUM<<endl;
}
;
}
手打一道题
广告印刷:
直接把模板拿出来
有n个数ai。从中选出一段区间[L,R],使得(R-L+1)*min{a-L…………a-R}最大,n<=1000000
考虑对于第i个数,求出当这个数成为最小值时,往左往右分别最远能到哪里。因此来更新答案,那就可以用单调队列来实现。
那么代码实现:
三、链表
不会做,没有代码就不写了。
四、ST表
不会做,没有代码就不写了。
(博主贼菜,毛都不会)
·
五、链上最值问题
给定一棵树,每次询问两个点x、y,求这两个点的路径上最长的边是多少。
怎么做?首先逐步分析,令F[i][j]表示i向上跳 2j 能跳到哪。
g[i][j]表示向上跳的过程中遇见的最长的边是多少。
如何求g?
那么就需要求一下两个点的LCA(最近公共祖先)
用倍增的方法求出x到LCA的最长边,y到LCA的最长边
所以最大值就可以表示出来了。
f[i][] g[i][]
g表示从i出发向上跳2^j步的最小值
; j<=; j++)
; i<=n; i++)
{
f[i][j]=f[f[i][j-]][j-];
g[i][j]=min(g[i][j-],
g[f[i][j-]][j-]);
}
x,LCA
k=deep[x]-deep[LCA]
; i>=; i--)
<<i))
{
MIN=min(MIN,g[x][i]);
k-=(<<i);
x=f[x][i];
}
sum[x]=从根出发到x 的长度之和
sum[x]+sum[y]-*sum[LCA];
代码有点多,可能会出现问题。
20,22就是指链上和问题
链上抑或和问题呢
这几个题都是一个类型,都需要求LCA。
Hash?线段树?
这些东西真的放一块好么?



(这里特别感谢张浩威老师的课件以及讲解,瞎几把写写,有问题请及时提出)
(线段树、链表、ST表这些都是非常重要的数据结构的知识点,但是博主并没有很掌握,可能得过段时间再更新了,清北学堂一天讲的东西还是很懵逼的,Day1还是和蔼可亲,Day2直接开始特别难什么马拉车的,Day3dp,博客也写的贼水,Day4也才刚刚写完,Day5又讲懵逼了一天,讲的图论,Day6又是数论,但愿这几天不要白费)
清北Day4的更多相关文章
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
- 清北Day 2
清北第二天,感受到了来自这个世界的不友善,大概把没听过不会的"名词"记录下来就已经一面了,然后被大佬说这都是最基础的东西,就很皮,那就趁别人练习字符串的题的时候,来写波博客了,倒不 ...
- 济南清北学堂游记 Day 1.
快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...
- 清北省选 DAY last 集锦
这是题目描述的链接: http://lifecraft-mc.com/wp-content/uploads/2018/03/problems1.pdf (虽然这次没去清北,但还是厚颜无耻的做了一下这套 ...
- 2017.10.1 国庆清北 D1T1 zhx的字符串题
题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...
- 7月清北学堂培训 Day 3
今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...
- 清北学堂模拟day4 捡金币
[问题描述]小空正在玩一个叫做捡金币的游戏.游戏在一个被划分成 n行 n列的网格状场地中进行.每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化. 小空的任务就是在网格中移动,拾取尽量多的 ...
随机推荐
- Spring Data JPA 简单查询--接口方法
一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...
- Android知识点网址
1.proguard字段详解 http://blog.csdn.net/jddkdd2/article/details/8858909 2.android提示框(时间,普通单选.多选对话框),常用控件 ...
- 查看某个ip地址接在交换机的哪个接口
show ip interface brief 1.如果交换机上没有做VLAN 可以直接使用:show arp MPG3560#sh arp Protocol Address Age (min) Ha ...
- ICC_lab总结——ICC_lab3:布局
PS:字丑,禁止转载. 做到了ICC workshop的第三个实验,理论与实践相结合,于是,先放一张总结图,这张总结图来自前面的博客,放在这里用来体现理论和实践的联系: 这个就是布局的理论部分,在IC ...
- 如何给sublime text3安装汉化包?so easy 哦
这是我本人亲身测试过的,肯定有效,没用的话怪我咯. 首先安装package control,然后安装汉化包即可,很简单哦!!! 1.安装package control:打开sublime,使用快捷键: ...
- CSS前端开发学习总结、一
1. 属性选择器: 2. CSS伪类选择器: 3. CSS伪元素: 4. CSS优先级: 5. 行内标签: 6. 块级标签: 7. Display: 8. Line-height:行高 9. text ...
- 解决子元素用css float浮动后父级元素高度自适应高度
1.在最后一个子元素后面清除浮动 2.父元素加over-flow:hidden;(副作用:子元素定位不能超出父元素的范围) 3.父元素也一样浮动(最笨的方法): 4.子元素使用inline-block ...
- 维护Study
##老师发了一个study来让我们纠错维护,整个软件是日程管理系统,分为欢迎界面,登录 注册界面,提醒界面添加日程界面,还有个人中心等.一些主要代码老师让我们把缺失部分去维护.首先我们读一下主要代码# ...
- 小练习,判断X的奇偶性
package lianxi1; public class text { public static void main(String[] args) { ; ==) { System.out.pri ...
- [原]node.js使用感想
最近尝试了使用node.js,但因为不是太深入(小项目,还没做完),所以不能谈心得谈经验,就来谈谈使用感想. node.js和以往的cgi接口的服务器+cgi程序(如apache+phpmod)中的单 ...