zoukankan      html  css  js  c++  java
  • 集训Day8

    旧试题Day2。。。

    bzoj3436

    有若干个集合和一些信息

    信息有3种:

    I.集合A比集合B至少多C个元素

    II.集合A比集合B至多多C个元素

    III.集合A和集合B元素一样多

    求这些信息是否有矛盾

    差分约束系统

    I.A->B C

    II.A->B -C

    III.A<->B 0

    然后spfa判正环

    bzoj3238

    先用后缀数组求出height。

    然后由于有LCP(a,c)=min(LCP(a,b),LCP(b,c))(rank[a]<rank[b]<rank[c]),所以我们只需要知道排名相邻的两个后缀的LCP,而这就是height数组的定义。

    转化为子问题:给出n个数,求所有子区间中最小值之和。

    考虑对答案的贡献,ai对答案的贡献为ai*(i-lpos+1)*(rpos-r+1),其中lpos表示i左边最后一个大于等于ai的位置,rpos表示i右边最后一个大于ai的位置。

    两边取等情况不同,目的是处理相同的数,防止重复或漏掉。

    可以使用单调栈在线性时间内求出i-lpos+1和rpos-r+1,然后加起来,作为原题答案的“-”后面的部分。

    前面的部分,由于每个字符串出现了n-1次,所以“-”前面部分答案为(n-1)*∑len[i]=(n-1)*n*(n+1)/2。

    最后把两数相减即可。

    bzoj4530

    LCT维护子树信息

    我们知道,在LCT中的Splay Tree中,access某个点并splay到根,那么它的实儿子记录的信息是这条链的信息,并不是我们想要的子树信息。

    而所有实儿子和虚儿子的信息才是我们想要求的子树信息。

    但是由于虚儿子“儿子认爹,爹不认儿子”的性质,无法在pushup的时候上传信息。

    事实上,我们注意到,对于Splay Tree的所有基本操作,除了access和link以外,都不会对虚儿子的信息进行修改。

    那么我们每次在添加虚儿子时,顺便把虚儿子的信息也记录到父亲节点中。

    这样我们每次调用一个节点时,将它Splay Tree中实儿子的信息,加上它自身的虚儿子的信息,就是我们想要的子树信息。

    于是我们对于每个节点记录两个信息:它的总信息和它虚儿子的信息,pushup时更新x的总信息为:x实儿子的总信息+x虚儿子的信息+x本身的信息。

    按照这种方法我们来思考这道题,可以发现所求的答案就是一条边两端点的子树大小乘积,我们把某一个端点定为整棵树的根,可以知道整棵树的大小,而根据另一个节点可以知道一个子树的大小,相减即为另一个子树的大小。

    具体的实现:

    access操作中割断了实边c[1][x],该边变为了虚边,所以应该加到x的虚儿子信息中,加入了实边t,该边不再是虚边,所以应从x的虚儿子信息中减去。

    link操作中为了在加入x时同时更新y的信息,需要makeroot(x),makeroot(y),然后连x->y的虚边(实际上只需要access(y)和splay(y))。

    其余的操作,和普通的LCT没有任何区别。

  • 相关阅读:
    iOS APP上线流程
    iOS开发:cocoapods的使用
    Swift:函数和闭包
    OC中单例的各种写法及基本讲解
    iOS:死锁
    iOS传值方式:属性,代理,block,单例,通知
    iOS支付
    Binary Tree Preorder Traversal——经典算法的迭代求解(前序,中序,后序都在这里了)
    Largest Number——STL的深层理解
    const、volatile、mutable的用法
  • 原文地址:https://www.cnblogs.com/Kong-Ruo/p/9204872.html
Copyright © 2011-2022 走看看