zoukankan      html  css  js  c++  java
  • 做题记录 2

    做题记录2

    10.9 牛客模拟 A

    结论题。注意到和不变,而C的变化相当于每次*2后再%sum。

    所以直接输出 (C*(2^k) mod sum) 就可以了。


    10.9 牛客模拟B

    首先先处理出到达一点 x 的所有路径中边权最大值的最小值,这点即可以最小生成树也可以直接spfa跑。

    也就是说每一个点中的那个种类的妹子只要当前的困难接受程度 (geq) 这个值,就可以获得,而如果有更小的同种类妹子,当前的显然无用。

    于是给每一个种类的最小值打上标记,然后每次用一个动态开点线段树统计就可以了。

    细节:每次先统计 ([0,l-1]) 再统计 ([l,r]) 两者统计方法不同(因为对整个答案的贡献是不同的,前者每一个标记贡献((r-l+1)),后者每一个标记贡献是 (r-loc+1) ,loc 指 标记所在位置)。线段树上维护一个cnt和sum就可以了。


    10.9 牛客模拟C

    对于一个点 x ,假设他的覆盖时间为 t

    那么他覆盖到他的一个祖先 y 所用时间就是 t+dep[x]-dep[y],

    而当前查询节点 z 与 x的lca 是 y的,且查询时间为 now 的话。

    那么一定 now >= t+dep[x]-dep[y]+dep[z]-dep[y]

    移项一下:now-dep[z]>=t+dep[x]-2*dep[y]

    显然左柿子是一个给定的值,只需要维护从 z 向上的所有 (t+dep[x]-2*dep[y]) 的最小值就好了。

    修改也只向上修改,因为每次只会修改一条连续的链,所以最小值一定只在整个区间的 r 处取得,(因为 r 处的 dep 最大)

    清空给整个线段树打一个覆盖标记就好了。


    10.9 牛客模拟D

    首先考虑菊花图的情况:那肯定就是一个类似于基于交换的贪心,只需要满足 (b_i*h_{i+1}>h_i*b_{i+1}) 就可以了。

    设一个点需要被攻击的次数为 (nd_i) ,能获得的防御力是 (d_i) 那么考虑整个图:

    首先可以通过反证法证明当一个点的儿子的性价比>父亲的性价比时一定打完父亲直接打儿子最优。

    那么其实对于儿子>父亲的情况可以直接看作将父亲和儿子变成一个连通块。

    那么打这个连通块的必要条件就是这个连通块的最高点的父亲被打了(


    10.10 联训 T1

    贪心,一开始先处理左括号,尽量往右边填,在处理右括号,尽量往左边填,然后删除掉所有空余的。


    10.10 联训 T2

    组合数,当这个数不选的时候,因为选了他的排名只会下降或不变,所以只能选不变的,也就是 (leq a_i/t) 或者 (>a_i) 的。

    而他选了,就必须选择那些原本大于他,现在小于他的,然后再在剩下的不会让他改变的里面选。

    注意处理重复的数的时候的细节。


    10.10 联训T3


    10.12 联训T3

    考虑到 type&1 的操作很是复杂,但是有type&1 的轮数不超过 (log n) 轮。于是模拟前log轮然后直接DS搞搞就好了。


    P2839 [国家集训队]middle

    求左端点在 ([a,b]) 右端点在 ([c,d]) 的子区间最大的中位数。

    首先考虑怎么求中位数:

    考虑二分答案:

    设当前二分到了mid

    将 >mid 的赋值成 1 ,小于 mid 的赋值为-1

    最大的和 >0 的值就是中位数。

    考虑这个区间的中位数的Check是怎么写的:

    和上面一样将 >mid 的赋值成 1 ,小于 mid 的赋值为-1

    区间 [b+1,c-1] 是必选的,那么剩下的一定是 [a,b] 中最大的后缀+[c,d]最大的前缀再加上必选的部分

    所以对于每一个mid建一棵线段树,某一个区间的和就是上面的(>mid=1)+(<mid=-1)的和,顺便维护一个区间前缀max和后缀max

    查询的时候直接搞搞就好了,其实建的是一个主席树,表示值下面位置的桶。

    开始先建一个全1的然后每次修改一个位置就好了,代码十分好写~


    P3908 数列之异或

    (1 xor 2 xor 3.......n)

    2n xor 2n+1 =1 ,显然。

    那么现在只需要考虑有多少对,显然就是n/4对,当然最后还会剩下来几个单的。

    前面的都是0,最后剩的1~3个讨论讨论就好了。


    某一天的C

    点有编号,边有编号,先给出一颗树,给出m组询问,询问边的编号是 [l1,r1],且连接的点的编号是[l2,r2],求点在 [l,r] 中的连通块的个数。

    显然个数=点数-边数,那么瓶颈就在于如何求连通块个数:

    直接转化成二位偏序搞搞就好了。


    P5300 [GXOI/GZOI2019]与或和

    每一位是独立的,显然直接拆位,那么这道题就转化成了如何求全1矩阵的个数和全0矩阵的个数

    先枚举行再枚举列,维护从当前行向上的连续1的个数,记为 Up。

    那么当你新加入一列,前面的列中 Up 比 当前列大 的矩阵一定不合法,减掉就好了,用一个单调栈维护。

    复杂度 (Theta(n^2log V))


    CF570D Tree Requests

    给定一个以 1 为根的 n 个结点的树,每个点上有一个字母(a-z),每个点的深度定义为该节点到 1 号结点路径上的点数。每次询问 a,b 查询以 a 为根的子树内深度为 b 的结点上的字母重新排列之后是否能构成回文串。

    dsu on tree板子题,每次记录子树中每一个深度的字符的出现次数。

    最后check的时候检查出现奇数次的字符是否只有1种或0种。


    牛客练习赛60E

    链接:https://ac.nowcoder.com/acm/contest/4853/E
    来源:牛客网

    现在有n个炉石玩家被挂在一棵有根树上,树根节点的标号是1.树是一种有n个点且有 (n−1)条边的结构, 并且一棵树保证没有环.

    n个点的每个点上都有一个炉石玩家,并且每个炉石玩家都有一个战力值为(a_i).对于树上的每一位炉石玩家,都有一棵属于他的子树,我们定义两个节点之间的距离为两个节点之间最短路径经过的边数.对于一个给定的值k,如果满足 (dis(i,j)=k),我们就说 i 和 j 旗鼓相当. dis(i,j)表 示树上节点 i 通过最短的路径到达节点 j 所经过的边的数量.

    现在需要统计每个炉石玩家的rating值, rating 值的计算方式是这样的,对于炉石玩家uuu的子树中的所有节点,如果 (x,y) 是旗鼓相当的,并且 (x,y) 的最近公共祖先是u且满足 (u eq x \, & \, u eq y) 那么u的rating就会增加 (a_x + a_y).

    dsu on tree 板子题 强制当前遍历的子树之和之前遍历过的子树匹配就好了,也就是先Calc一遍再修改,就带一个两倍的常数罢了。记录下当前深度有多少个点,与 (a_i) 的和。直接算就好了。


  • 相关阅读:
    C++模板实战6:迭代器
    Hacking up an armv7s library
    Android之ListView分页数据加载
    Android 命令行打包和签名
    django 自定模板标签的注册
    [置顶] 高效能人士的七个习惯读书笔记(二)
    价格战拉上了Android平板电脑
    Synergy 多系统共享鼠标键盘 Windows 和 Mac 完全配置教程
    global planner源码阅读
    源码安装eigen
  • 原文地址:https://www.cnblogs.com/NuoCarter/p/15385627.html
Copyright © 2011-2022 走看看