zoukankan      html  css  js  c++  java
  • Codeforces 1149 题解

    A

    特判全是 (2),对于有 (1) 的情况把 (1) 放到第二个和最后。
    时间复杂度 (O(n)).
    代码: 76492031

    B

    考虑只有一次询问的情况,有一个 (O(n^3)) 的 DP,设 (f[i][j][k]) 表示三个串分别匹配到 (i,j,k),大串最短匹配到哪。转移形如 ((i,j,k) ightarrow (i+1,j,k),(i,j+1,k),(i,j,k+1)).
    有修改相当于给某一维 (+1)(-1),显然影响到的 ((i,j,k)) 只有 (O(L^2)) 个,直接改即可。((L)(A,B,C) 串长度)
    时间复杂度 (O(n|Sigma|+qL^2)).
    代码: 76579067

    C

    显然问题就相当于选择三个数 (i,j,k) 满足 (0le ile jle kle n),最大化 (s_i-2s_j+s_k) ((s) 为前缀和),修改的形式为区间加或减 (2).
    线段树经典题。直接线段树维护 (s_i), (-s_j), (s_i-2s_j), (-2s_j+s_k), (s_i-2s_j+s_k)(max) 即可。
    时间复杂度 (O(n+qlog n)).
    代码: 76672305

    D

    由于边权只有两种,我们需要考察的状态显然是仅加入 (a) 边之后的连通状态。
    考虑一条从 (1)(p) 的路径,为了满足最小生成树的限制,我们仅仅需要满足路径上不出现“从某个连通块出来又重新进去”这种事情。
    有一个显然的状压 DP,设 (f[s][u]) 表示经过的连通块集合为 (s),现在处于点 (u). 其实严格来讲这是一张图,需要在上面跑最短路(因为需要处理 (s) 相同 (u) 在同一连通块内的转移)。
    问题是连通块个数太多了。一个很自然的想法是大小为 (1) 的连通块可以用一些手段缩去,但这还不够。事实上,大小不超过 (3) 的连通块都是不需要记录进 (s) 中的。因为如果从这个连通块里出去再回来至少要花费 (2b) 的代价,而这个连通块内任何两点的距离不超过 (2a).
    因此 (s) 只需要记录大小 (ge 4) 的连通块是否经过过的状态。这样的连通块最多只有 (frac{n}{4}) 个。
    最后在建出的图上跑两种边权的最短路即可。
    时间复杂度 (O(2^{frac{n}{4}}m)).
    代码: 76698798

    E

    结论:设 (f(u)= ext{mex}_{vin out[u]}f(v)),则可以把每个点表示为 (a_komega^{f_k}),就相当于一个只有第 (f_k) 个位置为 (a_i) 其余都为 (0) 的数组(这里的 (omega) 在博弈论里还有一些其他的神奇意义),则先手胜当且仅当对于每个位置,所有的点的异或和均为 (0) (即 (forall i,igoplus_{f[u]=i}a_u=0)).
    证明详见官方题解。
    时间复杂度 (O(n+m)).
    代码: 76707873

  • 相关阅读:
    Shell是linux下的脚本语言解析器
    semver 是 语义化版本
    js中限制字符串输入中英文字符的长度封装
    chalk.js(node终端样式库)
    分页
    利用Nodejs的os.networkInterfaces()模块修改vuecli项目默认打开地址
    物理像素
    长列表优化eg
    [JSOI2008]球形空间产生器
    标记不下传线段树(混蛋树)
  • 原文地址:https://www.cnblogs.com/suncongbo/p/12702242.html
Copyright © 2011-2022 走看看