zoukankan      html  css  js  c++  java
  • 倍增优化DP Codeforces 1175E

    9:38am;

    初步设想:线段树覆盖

     

     

    从根节点开始 对已给区间进行染色 如果查询区间 有未被染色部分 则输出 -1

     

    10:24am;

    但我寻思着?咋统计最小个数?

     

    CTRL + A

     

     

     

     

    10:40

    灵光乍现

     

     

    从查询的左节点依次开始往后覆盖,如果后面节点的长度 > 查询节点节点覆盖的最长 长度 那我ans++

     

    那就不需要线段树存状态了,依次查询就行了。

     

    11:00am

     

    一直在存状态,但是需要一输入就进行处理,(自闭一会,不会写了)

     

     

    好家伙写了一半 又觉得像线段树了。查询这个区间是否覆盖。

     

     

    好家伙线段树写了一半觉得这个又处理不了

    (自闭了)

     

     

     

     

     

     

     

     

     

    然后面对CSDN编程

     

     

    什么?不是线段树 那没事了

     

     

    DP那没事了

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    我:

     

     

     

     

     

    好家伙 (明白了 这就去写线段树)

     

     

     

     

     

    12:32

     

    啥都不会

     

    这就去请教 数据结构 大佬

     

     

     

     

     

     

    开始自闭学习 倍增优化DP

     

    14:40

     

    (1)为什么这道题要使用倍增

     

    (2)倍增的基本思想

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    第一点:

     

    给你n条线段[l,r]以及m组询问,每组询问给出一组[l,r],问至少需要取多少个线段可以覆盖[l,r]区间中所有的点。

    如果贪心地做的话,可以求出“从每个左端点l出发选一条线段可以到达的最右端点”,然后一直往右跳直到跳到r为止,

     

     

     

     

     

     

     

    这种复杂度是o(n)的,然后满心欢喜的写上去 你最终发现

     

     

     

     

     

     

    然后你就会

    8000ms的时间通过这道题(雾

    我开玩笑的

     

     

    你就会

     

     

     

     

     

    引入倍增这个思想

     原博客地址 :https://blog.csdn.net/dong_qian/article/details/81702697

    1522

     

     

     

     

    这个兔子想从A ————> B

     

    有一个2B小白兔,左右反复横跳

     

    有一个普通小白兔 一步一步的往B

     

    有一个超级小白兔 就直接飞一步到位

     

    啊这时候就有人问了,这超级小兔子怎么一步到位呢?

     

    那当然是前一天晚上 他先学普通小兔子一步一步跳,然后拿上宋毅学姐发给他的小抄本 记录下了这个位置

    第二天直接一步飞过去

     

    但是如果小白兔的目的地多了,宋毅学姐送他的小抄本就不够用

    这个时候怎么办呢

    他就需要宋毅学姐继续送他小抄本,但是宋毅学姐很忙,他又没钱自己买小抄本

     

    所以他请教了王永琪大佬,想问问他有什么新的打小抄方式

     

     

     

     

     

     

     

     

     

     

    他告诉小白兔

    A出发跳1步到1(记到小本本上

    1出发跳1步到2(记到小本本上

    跳一步的就记录完了

     

     从A出发跳2步?就是从A出发跳1步再跳1步的到的地方,翻看小抄,直接誊写从1出发跳1步会到的2这个格子作为A跳2步会到的格子。

    1出发跳2步?跟刚才一样,直接誊写。

    (跳2步的记录完毕)

     

    A出发跳4步?不会真去跳4步?不,它也就是等于从A出发跳2步到的2号点再跳2步会到的格子,那么我们直接誊写2号格子跳2步会到的格子就可以了。

     

     

     

     

     

     

     

    然后

     

    利用倍增的方法,可以预处理出

    从每个左端点l出发选2^k条线段可以到达的最右端点,设为dp[l][k],

     

    则有

    dp[l][k]=dp[dp[l][k−1]][k−1]dp[l][k]=dp[dp[l][k−1]][k−1],

     

     

    对于每组询问,让k从大到小依次尝试,如果从l跳2^k步跳不到r,那么答案就加上2^k。

     

    16:12分 题目A了

  • 相关阅读:
    51Nod--1247 可能的路径(gcd)
    51Nod--1117 聪明的木匠(排序)
    51Nod--1076 2条不相交的路径(强连通分量)
    HDU--4486 Task(贪心)
    BZOJ--1045-- 糖果传递(中位数,排序)
    [Windows Server 2012] Discuz X3安全设置
    [Windows Server 2012] PHPWind安全设置
    [Windows Server 2012] MySQL安全加固
    [Windows Server 2012] Filezilla安全加固方法
    [Windows Server 2012] WordPress安全设置方法
  • 原文地址:https://www.cnblogs.com/lightWh1te/p/13453631.html
Copyright © 2011-2022 走看看