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

今天就可以看到传说中的

数据结构

嘿嘿嘿嘿

都有什么呢

链表

队列

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向上跳 2能跳到哪。

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的更多相关文章

  1. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  2. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  3. 清北Day 2

    清北第二天,感受到了来自这个世界的不友善,大概把没听过不会的"名词"记录下来就已经一面了,然后被大佬说这都是最基础的东西,就很皮,那就趁别人练习字符串的题的时候,来写波博客了,倒不 ...

  4. 济南清北学堂游记 Day 1.

    快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...

  5. 清明培训 清北学堂 DAY1

    今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1)   高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...

  6. 清北省选 DAY last 集锦

    这是题目描述的链接: http://lifecraft-mc.com/wp-content/uploads/2018/03/problems1.pdf (虽然这次没去清北,但还是厚颜无耻的做了一下这套 ...

  7. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

  8. 7月清北学堂培训 Day 3

    今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...

  9. 清北学堂模拟day4 捡金币

    [问题描述]小空正在玩一个叫做捡金币的游戏.游戏在一个被划分成 n行 n列的网格状场地中进行.每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化. 小空的任务就是在网格中移动,拾取尽量多的 ...

随机推荐

  1. wx模块小实例

    功能介绍: 查询数据库表数据,提取数据并显示 main.py(执行文件) #coding:gbk __author__ = 'Hito' import querySmscode import wx c ...

  2. 说说API的防重放机制

    说说API的防重放机制 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击.重放攻击是什么呢?就是把你的请求原封不动地再发送一次,两次...n次,一般正常的请求都会通过验证进入到正常逻辑中,如果 ...

  3. java开发中获取路径的一些方式

    1.servlet开发获取WebContent(项目)的绝对路径: System.out.println(getServletContext().getRealPath("")); ...

  4. Python 使用心得之--变量命名

    目前开发命名规范基本都遵循驼峰命名法,如:userName.我也不将这个规范的特性了,大家都明白.接下来进入正题,如何在python中取一个好名字,让你能更好的见名知意呢? 1.元组(Tuple)类型 ...

  5. 2017-3-22 HTML 表单 、框架

    表单:<form action="" method="get/post" ></form> 表单元素:12个 1.文本类 文本框:< ...

  6. 应不应该使用inline-block代替float

    CSS布局创建网站,浮动绝对占据了很大的比例.大块区域如主内容及侧边栏,以及在其中的小块区域,都可以看到浮动的影子.这里浮动是唯一的解决方案吗? 浮动通常表现正常,但有时候搞起来会很纠结.特别是处理内 ...

  7. MYSQL性能优化--分库分表

    1.分库分表 1>纵向分表 将本来可以在同一个表的内容,人为划分为多个表.(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的.) 分表理由:根据数据的活跃度进行分离,(因为不同 ...

  8. 时效性福利:MindManager2017 破解攻略

    本文目的只是为了长期关注公众的活粉来谋个福利,24小时失效,没有提供盗版的意思 本文贡献的链接只存放2天,要下载的请从速~ 经过几个小时的奋斗,终于搞定了他,逆天我也终于可以从2016升级至2017~ ...

  9. 转:js,jQuery 排序的实现,网页标签排序的实现,标签排序

    js,jQuery 排序的实现: 重点: 想要实现排序,最简单的方法就是 先把标签用jQuery读进对象数组 用js排序好对象数组 (针对对象数组进行排序, 不要试图直接对网页的内容进行直接更改) 用 ...

  10. Windows 10 系统Microsoft Edge的使用手册

    Windows 10 默认浏览器(Edge)使用手册 体验网络有了一种新的方法.只有在 Windows 10 上才能找到它. 下面详细介绍一下Edge浏览器的使用规范: 一.打开Windows10系统 ...