草庐IT

CF构造题1600-1800(2)

随便写点什么 2023-03-28 原文

H. Hot Black Hot White(COMPFEST 14 - Preliminary Online Mirror (Unrated, ICPC Rules, Teams Preferred))

题意

\(n\) 个石头,每个石头有一个值 \(a_i\),现在需要给这 \(n\) 个石头染色,要求 \(\frac{n}{2}\) 为白色,\(\frac{n}{2}\) 为黑色( \(n\) 为偶数),并且任何两个颜色不相同的石头 \(i\)\(j\) 满足 :

\[concat(a_i,a_j) \times concat(a_j,a_i) + a_i \times a_j \not\equiv Z \bmod 3 \]

\(Z\) 与 染色方法。

\(concat(x, y)\) 表示 \(y\) 的十进制连接在 \(x\) 的十进制右边,例如:\(concat(10,24) = 1024\)

思路

\(len(x)\) 表示 \(x\) 的十进制表示法中的位数,所以 \(concat(x, y) = x \times10^{len(y)} + y\)

我们可以发现 \(10\) 的任何次幂模 \(3\) 是等于 1 的,所以 \(concat(x, y) \bmod 3= ((x \bmod 3)\times 1 + (y \bmod 3)) \bmod 3\)

有了上面的发现,我们可以轻松的化简题中的公式:

\[\begin{aligned} (concat(a_i, a_j) \times concat(a_j, a_i) + a_i \times a_j) \bmod 3 &= (((a_i + a_j) \times (a_j + a_i)) \bmod 3 + a_i \times a_j\mod 3) \bmod 3 \\ &= ((a_i^2 + a_j^2 + 2a_ia_j) \bmod 3 + a_i \times a_j\mod 3) \bmod 3\\ &= ((a_i^2 + a_j^2) \bmod 3 + 3a_ia_j \bmod 3) \bmod 3\\ &= (a_i^2+a_j^2) \bmod 3 \end{aligned} \]

也就是说我们要满足 \(a_i^2 + a_j^2 \not\equiv Z \bmod 3\) 这样的条件。

对于这个新的公式,我们同样有新的发现:

\[a_i^2 \bmod 3 = (a_i \bmod 3)^2 \bmod 3 \]

\(a_i \bmod 3\) 的值只能是 \(0,1, 2\)\(a_i^2 \bmod 3\) 的值只能是 \(0, 1\)

我们可以贪心的让值相同的 \(\frac{n}{2}\) 个数为白色(一定可以找到这么多数,因为数组现在只有两个值),为黑色的数可能有两个值\(0,1\)或者可能有一个值。

这是我们发现 \(a_i^2 + a_j^2 \bmod 3\) 的值最多只能是两个不同的数,而 \(Z \bmod 3\) 有三个不同的数,一定存在一个 \(Z\)

实现

void solve_problem() {
    int n;
    std::cin >> n;
    std::vector<int> a0, a1;
    for (int i = 0; i < n; i++) {
        int a;
        std::cin >> a;
        a = a % 3;
        a = a * a % 3;
        if (a == 0) a0.push_back(i);
        else a1.push_back(i);
    } 
    int Z = -1;
    std::string ans(n,'0');
    if (a0.size() > n/2) {
        Z = 2;
        for (int i = 1; i <= n/2; i++) {
            ans[a0[i]] = '1';
        }
    } else {
        Z = 0;
        for (int i = 1, j = (int)a1.size() - 1; i <= n/2; i++, j--) {
            ans[a1[j]] = '1';
        }
    }
    std::cout << Z << "\n" << ans << "\n";
}

F. Equate Multisets(Codeforces Round #805 (Div. 3))

题意

有两个集合 \(a\)\(b\) (集合中的数可以重复),每次操作可以选择集合 \(b\) 的任何一个元素 \(x\) 进行以下两种操作的一种:

  • \(x = x \times 2\)
  • \(x = \lfloor\frac{x}{2}\rfloor\)

求经过确定次数的操作后,两集合是否能相等(回答 YESNO)。

思路

首先可以发现如果 \(a\) 数组中的数是由 \(b\) 数组中的数最后通过 \(\times 2\) 转变来的,那么 \(a\) 数组中的这个数是偶数。

怎么运用这个发现呢?

我们可以考虑两个数组的最大值:

  • 如果最大值是 \(a\) 数组的,那么他一定是最后通过 \(\times2\) 操作转变来的,并且它一定要是偶数

  • 如果最大值是 \(b\) 数组的,那么这个数要转变为 \(a\) 数组中的数一定要进行 \(\lfloor\frac{x}{2}\rfloor\) 操作,因为 \(\times2\) 只会让它更大

  • 如果两个数组的最大值相等,那么很可能不进行任何操作。

我们可以维护两个优先队列来取最大值:

  • 如果最大值是 \(a\) 数组的,我们把它进行 \(\lfloor\frac{x}{2}\rfloor\) 在放进队列中,如果它是奇数,显然,这组数据是不能相等的。

  • 如果最大值是 \(b\) 数组的,我们同样把它进行 \(\lfloor\frac{x}{2}\rfloor\) 在放进队列中,只不过不用考虑奇偶了。

  • 如果两个数组的最大值相等,就把这两数 pop 掉。

最坏的情况我们可以对一个数进行 \(30\)\(\lfloor\frac{x}{2}\rfloor\) 操作,\(2n\) 个数就是 \(60n\)\(\lfloor\frac{x}{2}\rfloor\) 操作,但实际上远远达不到这么多。

实现

void solve_problem() {
    std::priority_queue<int, std::vector<int>, std::less<int>> qa, qb;
    int n;
    std::cin >> n;
    for (int i = 1; i <= n; i++) {
        int a;
        std::cin >> a;
        qa.push(a);
    }
    for (int i = 1; i <= n; i++) {
        int a;
        std::cin >> a;
        qb.push(a);
    }
    while (!qa.empty() && !qb.empty()) {
        int a = qa.top(); qa.pop();
        int b = qb.top(); qb.pop();
        if (a != b) {
            if (a > b) {
                if (a & 1) {
                    std::cout << "NO\n";
                    return;
                } else {
                    a /= 2;
                }
            } else {
                b /= 2;
            }
            qa.push(a);
            qb.push(b);
        } 
    }
    std::cout << "YES\n";
}

D. Cyclic Rotation(Codeforces Global Round 20)

题意

有数组 \(a\)\(b\),每次可以对数组 \(a\) 进行操作,选择两个下标 \(l\)\(r\) 并且 \(a_l = a_r\),使得 \(a[l\cdots r] = [a_{l+1},a_{l+2},\cdots a_r,a_l]\),求经过确定次操作后是否可以使两个数组相等(回答 YESNO)。

思路

首先可以发现进行过操作之后,选定的这个区间最后两个数是相等的,我们可以考虑反向操作,对数组进行还原。

我们从后向前进行双指针遍历,一个维护数组 \(a\) 的下标 \(i\), 一个维护数组 \(b\) 的下标 \(j\)

  • \(a_i = b_j\) 时,直接 \(i-1\)\(j-1\) 即可

  • \(a_i \neq b_j\) 并且 \(b_j = b_{j+1}\) 时,我们可以把 \(b_j\) 存起来,因为它可以放到前面的任意位置,接着进行 \(j-1\)

  • \(a_i \neq b_j\) 并且 \(b_j \neq b_{j+1}\) 时,把 \(a_i\) 与存起来的数进行比较,如果可以找到与 \(a_i\) 相同的,那么他们两个就是匹配的,把这个数在存起来的数中拿出,然后进行 \(i-1\) ;如果没有找到,那这两个数组是不可能通过操作来相等的。

我们可以用 std::map 来存数。

实现

void solve_problem() {
    int n;
    std::cin >> n;
    std::vector<int> a(n), b(n);
    for (auto &x : a) std::cin >> x;
    for (auto &x : b) std::cin >> x;
    if (b.back() != a.back()) {
        std::cout << "NO\n";
        return;
    }
    std::map<int, int> cnt;
    for (int i = n - 2, j = n - 2; i >= 0;) {
        if (j < 0 || a[i] != b[j]) {
            if (j >= 0) {
                if (b[j] == b[j + 1]) {
                    cnt[b[j]]++;
                    j--;
                    continue;
                }
            }
            if (cnt[a[i]] != 0) {
                cnt[a[i]]--;
                i--;
            } else {
                std::cout << "NO\n";
                return;
            }
        } else {
            i--;
            j--;
        }
    }
    std::cout << "YES\n";
}

有关CF构造题1600-1800(2)的更多相关文章

  1. ruby - 我如何从 Rational(或任何没有构造函数的类)继承? - 2

    例如,我可以很容易地继承自String,如下所示:classMyString'thingsandstuff'但是我如何继承没有构造函数的Rational呢?例如:defMyRatNoMethodError:undefinedmethod`new'forMyRat:ClassMyRat(10).inc#=>NoMethodError:undefinedmethod`MyRat'formain:ObjectMyRat.send(:initialize,10).inc#=>TypeError:alreadyinitializedclass#???#Noneofitworks!我找不到初始化新

  2. ruby - 这种类似哈希/树状的构造称为什么? - 2

    我想创建一个介于散列和树之间的“Config”类。它只是用于存储全局值,可以有一个上下文。下面是我的使用方法:Config.get("root.parent.child_b")#=>"value"类可能如下所示:classConstructdefget(path)#splitpathby"."#searchtreefornodesenddefset(key,value)#splitpathby"."#createtreenodeifnecessary#settreevalueenddeftree{:root=>{:parent=>{:child_a=>"value",:child_b=

  3. ruby - 将构造函数参数转换为实例变量 - 2

    这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Idiomaticobjectcreationinruby很多时候我有一个initialize方法,看起来像这样:classFoodefinitializebar,buz,...@bar,@buz,...=bar,buz,...endend有没有办法用一个简单的命令来做到这一点,比如:classFooattr_constructor:bar,:buz,...end其中的符号代表实例变量的名称(具有attr_accessor、attr_reader、attr_writer的精神/风格)?我想知道是否有内置的方式

  4. 通过传递构造函数的 Ruby YAML 解析器 - 2

    我正在开发一个应用程序,该应用程序从YAML文件获取输入,将它们解析为对象,然后让它们执行它们的操作。我现在遇到的唯一问题是YAML解析器似乎忽略了对象“初始化”方法。我指望构造函数用默认值填充YAML文件缺少的任何实例变量,并将一些东西存储在类变量中。这是一个例子:classTest@@counter=0definitialize(a,b)@a=a@b=b@a=29if@b==3@@counter+=1enddefself.how_manyp@@counterendattr_accessor:a,:bendrequire'YAML'a=Test.new(2,3)s=a.to_yaml

  5. Ruby 构造函数和异常 - 2

    Ruby新手,我想弄清楚使用什么习惯用法来将某些整数值限制为类的构造函数。根据我目前所做的,如果我在initialize()中引发异常,该对象仍会创建,但将处于无效状态(例如,某些nil实例变量中的值)。我不太明白我应该如何限制这些值而不进入看起来不必要的大步骤,例如限制对new()的访问。所以我的问题是,我可以通过什么机制来限制实例化对象的值范围? 最佳答案 嗯,你是完全正确的,即使initialize引发异常,对象仍然存在。然而,任何人都很难坚持引用,除非你从initialize中泄漏self就像我刚写的下面的代码一样:>>cl

  6. ruby-on-rails - 如何使用 Ruby 中哈希的查询参数构造 URI - 2

    如何通过传递哈希来构造带有查询参数的URI对象?我可以生成查询:URI::HTTPS.build(host:'example.com',query:"a=#{hash[:a]},b=#{[hash:b]}")产生https://example.com?a=argument1&b=argument2但是我认为为许多参数构造查询字符串将不可读且难以维护。我想通过传递哈希来构造查询字符串。就像下面的例子:hash={a:'argument1',b:'argument2'#...dozenmorearguments}URI::HTTPS.build(host:'example.com',que

  7. ruby - 如何更改 Ruby 中类构造函数的返回值? - 2

    我有课,Foo。我希望能够向构造函数传递一个Foo实例,foo并返回相同的实例。换句话说,我希望这个测试通过:classFoo;endfoo=Foo.newbar=Foo.new(foo)assert_equalfoo,bar有人知道我该怎么做吗?我试过这个:classFoodefinitialize(arg=nil)returnargifargendendfoo=Foo.newbar=Foo.new(foo)assert_equalfoo,bar#=>fails但它不起作用。帮忙吗?编辑因为很多人问过我的理由:我正在对大量数据(许多TB)进行快速分析,并且我将拥有大量对象的大量实例。

  8. ruby-on-rails - 文字和构造函数之间的区别? ([] 与 Array.new 和 {} 与 Hash.new) - 2

    我很想知道[]和Array.new以及{}和Hash.new之间的更多区别我对它进行了相同的基准测试,似乎简写是赢家require'benchmark'many=500000Benchmark.bmdo|b|b.report("[]\t"){many.times{[].object_id}}b.report("Array.new\t"){many.times{Array.new.object_id}}b.report("{}\t"){many.times{{}.object_id}}b.report("Hash.new\t"){many.times{Hash.new.object_id

  9. ruby - 构造函数覆盖 - 2

    我有一个类:classOnedefinitialize;endend我需要像这样用我自己的构造函数创建一个新类:classTwo但是当我启动代码时,出现错误:thingtest.rb:10:in`initialize':wrongnumberofarguments(1for0)(ArgumentError) 最佳答案 super在这种情况下(没有括号)是一种特殊形式。它使用原始参数调用父类(superclass)方法。尝试调用super() 关于ruby-构造函数覆盖,我们在StackO

  10. ruby - 在 ruby​​ 中调用父构造函数 - 2

    如何调用父类的构造函数?moduleCattr_accessor:c,:ccdefinitializationc,cc@c,@cc=c,ccendendclassBattr_accessor:b,:bbdefinitializationb,bb@b,@bb=b,bbendendclassA谢谢。 最佳答案 Ruby没有构造函数,因此显然不可能调用它们,无论是父类还是其他。然而,Ruby确实有方法,并且为了调用与当前正在执行的方法同名的父方法,您可以使用super关键字。[注意:不带参数的super是传递与当前正在执行的方法相同的参数

随机推荐