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

今天就可以看到传说中的

数据结构

嘿嘿嘿嘿

都有什么呢

链表

队列

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. Web API框架学习——路由(一)

    HttpConfiguration(ASP.NET Web API管道的配置是通过HttpConfiguration来完成) : 包括路由注册在内的对整个ASP.NET Web API管道的配置是通过 ...

  2. NIO(二、Buffer)

    目录 NIO(一.概述) NIO(二.Buffer) Buffer 前文讲了NIO与IO的区别,那么这一章开始讲述NIO下核心类 - Buffer类 上一章就说过,NIO的核心包括三个部分:通道(Ch ...

  3. Exchange 2016 体系结构

    Exchange Server 2016 使用一个构建基块体系结构,提供电子邮件服务,以便在各种规模的组织(从小型组织到最大规模的跨国企业)进行部署.这种体系结构如下图所示.包含两个角色,邮箱服务器角 ...

  4. 【原】老生常谈-从输入url到页面展示到底发生了什么

    刚开始写这篇文章还是挺纠结的,因为网上搜索“从输入url到页面展示到底发生了什么”,你可以搜到一大堆的资料.而且面试这道题基本是必考题,二月份面试的时候,虽然知道这个过程发生了什么,不过当面试官一步步 ...

  5. 《用Python做HTTP接口测试》学习感悟

    机缘巧合之下,报名参加了阿奎老师发布在"好班长"的课程<用Python做HTTP接口测试>,报名费:15rmb,不到一杯咖啡钱,目前为止的状态:坚定不移的跟下去,自学+ ...

  6. java程序包不存在

    当把classpath和path设置好之后. 自己写了个类的,然后放在test_package\mypackage路径下.主函数要用到.但是却出错了. 我一开始怀疑自己的classpath配置错了,在 ...

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

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

  8. 关于JavaScript中连等赋值那点事

    今天看了前端网上关于JS的题目,其中有一道题目挺有意思的.如下 var a = b =10; (function(){ var a = b = 20; })(); console.log(a); co ...

  9. Oracle SQL 语言分类

     Oracle SQL语句分类 2008-06-17 11:15:25 分类: Linux * 2008/06/17  星期二*蒙昭良*环境:WindowsXP + Oracle10gR2*Oracl ...

  10. js原生的轮播图

    <!DOCTYPE html>   <html>   <head>   <meta charset="UTF-8">   <t ...