zoukankan      html  css  js  c++  java
  • 「SDOI2017」切树游戏

    题目描述

    小 Q 是一个热爱学习的人,他经常去维基百科学习计算机科学。

    就在刚才,小 Q 认真地学习了一系列位运算符,其中按位异或的运算符 $oplus$ 对他影响很大。按位异或的运算符是双目运算符。按位异或具有交换律,即 $i oplus j = j oplus i$。

    他发现,按位异或可以理解成被运算的数字的二进制位对应位如果相同,则结果的该位置为 $0$,否则为 $1$,例如:$1(01) oplus 2(10) = 3(11)$。

    他还发现,按位异或可以理解成参与运算的数字的每个二进制位都进行了不进位的加法,例如:$3(11) oplus 3(11) = 0(00)$。

    现在小 Q 有一棵 $n$ 个结点的无根树 $T$,结点依次编号为 $1$ 到 $n$,其中结点 $i$ 的权值为 $v_i$。
    定义一棵树的价值为它所有点的权值的异或和,一棵树 $ T $ 的连通子树就是它的一个连通子图,并且这个图也是一棵树。
    小 Q 想要在这棵树上玩切树游戏,他会不断做以下两种操作:
    - ``Change x y``,将编号为 $x$ 的结点的权值修改为 $y$。
    - ``Query k``,询问有多少棵 $T$ 的非空连通子树,满足其价值恰好为 $k$。

    小 Q 非常喜(bu)欢(hui)数学,他希望你能快速回答他的问题,你能写个程序帮帮他吗?


    数据范围

    对于 $100\%$ 的数据,$1 leq a_i, b_i, x leq n$,$0 leq v_i, y, k < m$,修改操作不超过 $10000$ 个。

    | 测试点编号 | $n$ | $m$ | $q$ | 约定 |
    | :-: | :-: | :-: | :-: | :-: |
    | 1 ~ 4 | $leq 2000$ | $= 64$ | $leq 64$ | 不存在修改操作 |
    | 5 ~ 8 | $leq 30000$ | $= 8$ | $leq 30000$ | $a_i = i$,$b_i = i + 1$ |
    | 9 ~ 10 | $leq 30000$ | $= 128$ | $leq 30000$ | $a_i = i$,$b_i = i + 1$ |
    | 11 ~ 15 | $leq 30000$ | $= 4$ | $leq 30000$ | 无 |
    | 16 ~ 20 | $leq 30000$ | $= 128$ | $leq 30000$ | 无 |


    题解

    列出dp: $f_{i,j}$ 表示以 $i$ 为根,包含 $i$ 的权值为 $j$ 的子树个数, $s_{i,j}$ 表示以 $i$ 为根, $i$ 子树内权值为 $i$ 的子树个数,用 $Fwt$ 转移即可

    如果有修改的话,上ddp就好了

    把矩阵的式子列出来,发现只要维护 $4$ 个值即可

    ~~代码先咕着~~

  • 相关阅读:
    Centos6.5环境中安装vsftp服务
    MySQL数据库的数据备份和恢复(导入和导出)命令操作语法【转】
    linux系统被入侵后处理经历【转】
    Linux lsof命令详解和使用示例【转】
    Oracle 表空间和用户权限管理【转】
    如何在 Linux 中找出最近或今天被修改的文件
    Linux 服务器系统监控脚本 Shell【转】
    1张图看懂RAID功能,6张图教会配置服务器【转】
    简析TCP的三次握手与四次分手【转】
    TCP协议中的三次握手和四次挥手(图解)【转】
  • 原文地址:https://www.cnblogs.com/xjqxjq/p/12247061.html
Copyright © 2011-2022 走看看