CSP模拟赛Confess

Posted firecrazy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSP模拟赛Confess相关的知识,希望对你有一定的参考价值。

题目描述

  小w隐藏的心绪已经难以再隐藏下去了。小w有n+ 1(保证n为偶数)个心绪,每个都包含了[1,2n]的一个大小为n的子集。现在他要找到隐藏的任意两个心绪,使得他们的交大于等于n/2。

输入描述

  一行一个整数n。接下来每行一个长度为k的字符串,该字符串是一个64进制表示,ASCII码为x的字符代表着x-33,所有字符在33到33+63之间。转为二进制表示有6k位,它的前2n个字符就是读入的集合,第i位为1表示这个集合包含i,为0表示不包含。

输出描述

  一行两个不同的整数表示两个集合的编号。如果无解输出“NO Solution”

样例输入

  10
  EVK#
  IH=#
  676"
  R7,#
  74S"
  6V2#
  O3J#
  S-7$
  NU5"
  C[$$
  3N.#

样例输出

  1 2

  对于20%的数据满足n≤100。
  对于50%的数据满足n≤1×103
  对于100%的数据满足n≤6×103

分析

  我觉得应该没有人会想到暴力即是正解

  首先先看一眼数据规模,好像用int存字符串会炸内存,于是考虑用bitset

  不然就像我一样爆零

  然后就可以暴力地O(n3/32)地做啦

  我们来验证一下它的正确性

  任选出两个子集,考虑每个元素在两个子集中共有的概率,加起来就是期望共有的个数

  由于总共有2n个元素,每个子集有n个元素,那么一个元素在子集内的概率就是$frac 1 2$,

  那么一个元素同时在两个子集内的概率就是$frac 1 4$

  所以任选两个子集期望的共有的个数是$frac 1 4 imes 2n=frac n 2$

  当然,这个期望值是建立在数据纯随机的情况下的

  我们接下来可以求一下在出题人控制了数据的情况下我们任选两个子集,子集的共有元素的期望个数

  假设第i号元素有Si个子集拥有,那么对于i号元素就有$C_{Si}^2$种情况任选两个子集都包含i号元素,而任选两个子集的情况总数为$C_{n+1}^{2}$

  所以对于i号元素,任选两个子集都包含它的概率为

  $$frac {C_{Si}^2}  {C_{n+1}^2}$$

  任选两个子集的期望共有元素个数为

  $$sum_{i=1}^{2n} frac {C_{Si}^2} {C_{n+1}^2}$$

  显然出题人可以控制每个Si的大小来卡我们,但他无法控制其它数的大小。

  我们只要求出这个东西的最小值就可以知道出题人是否能卡我们

  而且我们还知道

  $$sum_{i=1}^{2n} Si=n(n+1)$$

  所以我们化简一下这个式子

  $$sum_{i=1}^{2n} frac {C_{Si}^2} {C_{n+1}^2}$$

  $$=frac { sum_{i=1}^{2n} {C_{Si}^2} } {C_{n+1}^2}$$

  $$=frac {sum_{i=1}^{2n} { frac {Si imes (Si-1) } {2} } } { frac {n imes (n+1)} {2} }$$

  $$=frac {sum_{i=1}^{2n} {Si imes (Si-1)}} {n imes (n+1)}$$

  $$=frac {sum_{i=1}^{2n} {Si^2} - sum_{i=1}^{2n} {Si}} {n imes (n+1)}$$

  $$=frac {sum_{i=1}^{2n} {Si^2} - n(n+1)} {n(n+1)}$$

  接下来只需要根据$sum_{i=1}^{2n} Si=n(n+1)$求出$sum_{i=1}^{2n} {Si^2}$的最小值就好啦

  我们可以小的情况推到大的情况,比如知道$a+b=x$,求$min(a^2+b^2)$

  可以用均值不等式的思想来证明

  因为$(a-b)^2 geq 0$,所以$a^2+b^2 geq 2ab$

  又因为$(a+b)^2=x^2$,所以$2ab=x^2-a^2-b^2$

  代入$a^2+b^2 geq 2ab$就有$a^2+b^2 geq {frac {x^2} {2}}$

  同理,因为

  $$sum_{i=1}^{2n}sum_{j=1}^{2n}(Si-Sj)^2 geq 0$$

  所以

  $$sum_{i=1}^{2n}sum_{j=1}^{2n}(Si^2+Sj^2-2SiSj) geq 0$$

  $$sum_{i=1}^{2n}sum_{j=1}^{2n}Si^2 + sum_{i=1}^{2n}sum_{j=1}^{2n}Sj^2 - sum_{i=1}^{2n}sum_{j=1}^{2n}2SiSjgeq 0$$

  $$sum_{i=1}^{2n}sum_{j=1}^{2n}Si^2 + sum_{i=1}^{2n}sum_{j=1}^{2n}Sj^2geq 2sum_{i=1}^{2n}sum_{j=1}^{2n}SiSj$$

  $$2nsum_{i=1}^{2n}Si^2 +2nsum_{j=1}^{2n}Sj^2geq 2sum_{i=1}^{2n}sum_{j=1}^{2n}SiSj$$

  $$4nsum_{i=1}^{2n}Si^2geq 2sum_{i=1}^{2n}sum_{j=1}^{2n}SiSj$$

  又因为$sum_{i=1}^{2n} Si=n(n+1)$

  所以

  $$left ( sum_{i=1}^{2n} Si ight )^2=n^2(n+1)^2$$

  $$sum_{i=1}^{2n}sum_{j=1}^{2n}SiSj=n^2(n+1)^2$$

  代入上面的不等式就有

  $$4nsum_{i=1}^{2n}Si^2geq 2sum_{i=1}^{2n}sum_{j=1}^{2n}SiSj=2n^2(n+1)^2$$

  $$sum_{i=1}^{2n}Si^2geq frac {n(n+1)^2} {2}$$

  我们终于求出了$sum_{i=1}^{2n}Si^2$的最小值

  把它代入我们之前求出的式子里

  $$frac {sum_{i=1}^{2n} {Si^2} - n(n+1)} {n(n+1)}geq frac {frac {n(n+1)^2} {2}-n(n+1)} {n(n+1)}$$

  $$=frac {n+1} {2} -1=frac {n-1} {2}$$

  所以不管出题人怎么出数据,任选两个字符串共有元素的期望个数最小都是$frac {n-1} {2}$,所以直接O(n^3/32)是很正确的

  代码?我™手贱重启电脑清空了

以上是关于CSP模拟赛Confess的主要内容,如果未能解决你的问题,请参考以下文章

冲刺CSP-S集训模拟赛总结

CSP模拟赛#3 分段(T1-26)

CSP模拟赛#4 权值(T2-26)

CSP模拟赛方程(数学)

csp模拟赛5限制 (restrict.cpp)--数学

「CSP-S模拟赛」2019第二场