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

今天就可以看到传说中的

数据结构

嘿嘿嘿嘿

都有什么呢

链表

队列

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. SSH登录与增删改查demo详解+源代码

    点击下载,测试绝对可用SSH整合框架登录加增删改查demo 下载地址:http://download.csdn.net/detail/qq_33599520/9784679   一.框架概述 spri ...

  2. "浏览器端" 使用 commonjs 模块规范开发网页应用,像开发 node 那样开发网页应用

    Containjs 1.0 Containjs 是什么? Containjs 是一个基于 Commonjs 模块管理规范的 浏览器端 的 JavaScript 模块加载器(目前为非标准的,代码会持续迭 ...

  3. Python 爬取qqmusic音乐url并批量下载

    qqmusic上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的.于是,来了个qqmusic的爬虫. 至少我觉得for循环爬虫,最核心的应该就是找到待爬元素所在ur ...

  4. [译]Selenium Python文档:七、WebDriver API接口

    由于API文档格式不太适合cnblog博客,暂且翻译一部分,且暂未校对 注意:这不是官方文档,官方 API文档在这里. 本章包含Selenium WebDriver的所有接口 推荐import风格 本 ...

  5. 【iOS】7.4 定位服务->2.1.4 定位 - 官方框架CoreLocation 案例:指南针效果

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  6. CDMA sid, nid, bid 含义解释

    copyright@ celldb.cc SID 是系统识别码,每个地级市只有一个sid,是唯一的. NID是网络识别码,由各本地网管理,也就是由地级分公司分配.每个地级市可能有1到3个nid. BI ...

  7. 手动es6编译es5(命令行)

    package.json:"devDependencies": { "babel-cli": "^6.18.0", "babel- ...

  8. pyqt4实现tab界面切换

    (转:https://segmentfault.com/q/1010000005143428)

  9. iOS截取http/https流量

    0x01.Why? 做移动测试的同学经常会在app和server中间架设一个代理(例如charles或者fiddler等),由经代理,app和server之间的交互及交互内容变得可视化,使得我们不再摸 ...

  10. 关于SQL调优(Distinct 和 Exits)

    今天写了一段查询人员Id和人员编号的,由于需要从其他的表中取条件,因为人员表和另外的表对应的是一对多的关系,所以我使用了Distinct关键字对用户编号进行去重复,然后发现那个效率简直没法看,然后旁边 ...