zoukankan      html  css  js  c++  java
  • ARC127 比赛记录

    打烂了。
    被 A 卡了。
    胡了 B 然后直接 skip 了。
    被 C 卡了较长时间。
    回头过 B。
    卡了 D。

    A

    \(1\cdots n\) 所有前缀数前缀 \(1\) 个数和。
    求出至少有一个长度为 \(k\) 的前缀 \(1\) 的个数之和。
    枚举 \(k\) 然后枚举这个前缀出现位置即可。
    复杂度 \(O(\text{poly}(15))\)

    B

    直接构造。
    发现第一位肯定有 \(n\)\(0\)\(n\)\(1\)\(n\)\(2\)
    然后第一位的 \(0\)\(1\) 不管只需要第一位的 \(2\) 后面跟着的最小即可。
    直接暴搜搜出前 \(3^{K-1}\) 个最小的,然后直接填即可。

    C

    直接做做完了。
    考虑先整体减一,第一位肯定是 \(1\) 然后诸位确定。
    如果当前数是 \(0\),那结束了。
    否则如果属于 \([1,2^{m-1})\) 肯定是 \(0\),否则是 \(1\)
    如果属于 \([1,2^{m-1})\) 那最高位就是 \(0\) 否则是 \(1\) 所以可以 \(O(1)\) 判断。
    然后如果最高为是 \(0\) 就减 \(1\) 否则删去最高位。
    根据结论对于一个二进制模拟进位复杂度均摊是 \(O(1)\) 的。
    然后判断是否全 \(0\) 直接动态维护当前全局 \(1\) 个数即可。

    D

    卡 @AhoCorasick 的
    我们需要判断 \(a_i\oplus a_j\)\(b_i\oplus b_j\) 的关系。
    考虑比较两个二进制数,是找到他们最高不相同位置然后比较,本质上就是 \(\oplus\)
    那我们对于每个 \(i\) 我们把 \(a_i\oplus b_i\) 作为代表,那两个数不同只需要比较代表元最高的不同位即可。
    我们考虑在最高不同位处统计贡献。
    考虑把所有当前这位是 \(0\) 的答案塞到桶里去,然后在对每个 \(1\) 在桶里查询。
    有贡献当且仅当:它之前相同(信息量 \(O(n)\)),当前这位不同。
    然后贡献计算需要每位拆开,同时还需要记录贡献的是 \(a\) 还是 \(b\)
    这里直接分类讨论一下即可。
    总复杂度是 \(O(n\log ^2n)\)

    E

    草,思维题!!!
    考虑把最终集合排序,然后找到字典序最大的。
    显然就是每次 \(1\) 操作插入 \(1\) 时最大。
    如果字典序大于这个最大字典序肯定无解(听君一席话)
    如果小于,必定有解。
    考虑构造,设那些在答案中出现的为目标状态,然后从小到大排序。
    从小到大逐个插入,如果碰到 \(2\) 就拿个不是答案来“垫背”。
    可以证明对于每个数“垫背”的数一定存在,所以它肯定可以被构造。
    然后搞个 \(O(n^2)\) dp

  • 相关阅读:
    C语言第四次博客作业嵌套循环
    C语言第六次博客作业数据类型
    C语言第五次博客作业函数
    C语言第二次博客作业分支结构
    MD5 DSA RSA 简单 区别
    关于Linux Grep命令使用的详细介绍
    最好、最智能化、最方便的Java开发软件 IntelliJ IDEA 10.5.2
    Linux Find 命令精通指南
    linux 下面递归查找
    公钥和私钥的解释
  • 原文地址:https://www.cnblogs.com/pealfrog/p/15337717.html
Copyright © 2011-2022 走看看