清北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列的网格状场地中进行.每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化. 小空的任务就是在网格中移动,拾取尽量多的 ...
随机推荐
- Thrift序列化与反序列化的实现机制分析
Thrift是如何实现序死化与反序列化的,在IDL文件中,更改IDL文件中的变量序号或者[使用默认序号的情况下,新增变量时,将新增的变量不放在IDL文件的结尾,均会导致Thrift文件的反序列后无法做 ...
- C#全局鼠标键盘Hook
原文出自:http://www.cnblogs.com/iEgrhn/archive/2008/02/17/1071392.html using System; using System.Collec ...
- Struts2之标签使用
上一篇我们一起探讨了Struts2中的OGNL表达式的知识,本篇我们一起来学习一下关于Struts2标签的使用,包括:基础标签:property.set.bean.include:判断标签:if el ...
- React开发的一些注意点
react是R系技术栈中最基础同时也是最核心的一环,2年不到获取了62.5k star(截止到目前),足可见其给力程度.下面对一些react日常开发中的注意事项进行罗列.建议初学的朋友还是先过一遍这篇 ...
- 读书笔记 effective c++ Item 37 永远不要重新定义继承而来的函数默认参数值
从一开始就让我们简化这次的讨论.你有两类你能够继承的函数:虚函数和非虚函数.然而,重新定义一个非虚函数总是错误的(Item 36),所以我们可以安全的把这个条款的讨论限定在继承带默认参数值的虚函数上. ...
- linux ip 转发设置 ip_forward
工作原理: 内网主机向公网发送数据包时,由于目的主机跟源主机不在同一网段,所以数据包暂时发往内网默认网关处理,而本网段的主机对此数据包不做任何回应.由于源主机ip是私有的,禁止在公网使用,所以必须将数 ...
- 深入理解CPU和异构计算芯片GPU/FPGA/ASIC (上篇)
王玉伟,腾讯TEG架构平台部平台开发中心基础研发组资深工程师,专注于为数据中心提供高效的异构加速云解决方案.目前,FPGA已在腾讯海量图片处理以及检测领域已规模上线. 随着互联网用户的快速增长,数据体 ...
- mariadb 长链接时间限制导致队列消费进程崩溃
项目是一个数据同步项目,线下Android客户端把本地sqllite数据提交到云端队列,php做守护进程消费队列,以同步数据.初测没有问题,可是时不时出现诡异的崩溃,因为设置了错误邮件报警,发现错误代 ...
- 每天学点Java小知识【1】
一 Java标识符和关键字 1.标识符 作用:用来标识类名.变量名.方法名.类型名.数组名.文件名的有效字符序列. 组成规则:由字母.下划线.美元符号和数字组成,且第一个字符不能是数字字符.注意:标识 ...
- 网站防止SQL注入方法
方法:所有获取GET.POST变量都先进行过滤: 字符串-- htmlspecialchars(addslashes($string)) addslashes() 函数返回在预定义字符之前添加反斜杠 ...