zoukankan      html  css  js  c++  java
  • bzoj 题目选做

    这里将记录着我在接下来的日子里在bzoj上遇到的各种 毒瘤题目

    1.轮状病毒

    题目是很没意思的 列出状态 显然无法递推 我简单推了一下加动态加点的状态 嗯发现规律没有那么简单 打表 也不太能发现吧

    正解显然是 矩阵树定理啊 然后这题咕了 以后再复习矩阵树定理的时候再证明这个结论吧 暂时当做打表做的。

    $f_n=f_n*3-f_{n-1}+2$ 然后高精加和高精减即可。由于都是高精和单精之间的运算 所以还是很好写的。

    2.[NOI2003 EDitor](https://www.lydsy.com/JudgeOnline/problem.php?id=1507)

    这道题还是蛮有意义的学习一下块状链表...(这样我就可以写分块第k大带插入带修改了哈哈

    2h过后这啥玩意啊 ex到我了 没想到细节这么多这么复杂 大致是了解了 改天重新了解一下...自闭中。

    3.[4180字符串计数](https://www.lydsy.com/JudgeOnline/problem.php?id=4180)

    这题鬼的很!看了一眼题解因为真觉得不太会写这道题。

    题目意思是 给出一个字符串T 每次我们可以从这个T中取出一个子串构造出来一个长度为n的字符串 且T的字符集为{A B C D}

    定义一个长度为n的字符串需要添加子串的次数是最小的,求所有能被构造出来长度为n的字符串所花费的最大次数。

    很绕 因为存在最小的最大。这个问题很难去考虑 让人觉得无从下手 因为不知道怎么构造是合法的是最小次数的同时怎么求次数最大。

    首先 就从最小次数出发 先构造出来T的后缀自动机,里面存有我们想要的所有子串。然后我们从一个能被构造出来的字符串S 求出怎么构造才是使次数最小。

    显然我们让S在T的后缀自动机上跑 跑不动了回到原点继续跑 在原点的次数即最小构造次数 为什么这是最小的?显然。自证不难。

    现在我们再来考虑这个问题的模型 在后缀自动机上走n步求经过原点的次数最大。

    我们显然有dp f[i][j]表示到了节点i已经走了j步所能获得的最大值 这个dp的复杂度是$Tcdot n$的考虑优化.

    我们出发点是固定的原点所连的那几个节点 接下来顺着这几个节点跑还是会回到这个几个节点 不妨设f[i][j]表示 从i节点到j节点经过的边数最小值 当然i和j 一定都是出发节点。这个topsort一下或者bfs一下都可以求出来.

    于是我们发现了 刚才那个dp已经被我们转换到了4个点之间的转移了当然复杂度还是近乎4*n的 考虑进一步的优化我们发现这个dp的转移是一个线性递推式矩阵乘法可以优化 进一步来说每乘一次转移矩阵答案+1 还是很难求出答案 但是我们能根据答案求步数 所以二分这个答案 求出在这个答案的情况下的最小步数 从而来判定答案的大小范围即可.

    值得一提的是这样做是log^2的 还要乘上矩阵乘法的常数...更快的做法是直接倍增答案即可以一个log解决。

  • 相关阅读:
    OpenLayers的定制
    基于Emgu CV的人脸检测代码
    C#中跨库事务处理解决方案
    SqlHelper简单实现(通过Expression和反射)5.Lambda表达式解析类
    SqlHelper简单实现(通过Expression和反射)8.Sql Server数据处理类
    SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择
    SqlHelper简单实现(通过Expression和反射)1.引言
    SqlHelper简单实现(通过Expression和反射)3.实体,数据传输对象(DTO)Helper类设计
    SqlHelper简单实现(通过Expression和反射)7.MySql数据处理类
    SqlHelper简单实现(通过Expression和反射)10.使用方式
  • 原文地址:https://www.cnblogs.com/chdy/p/12121339.html
Copyright © 2011-2022 走看看