首页 > 其他分享 >CF 瞎写记录

CF 瞎写记录

时间:2022-11-11 21:57:40浏览次数:70  
标签:记录 mid CF 集合 YES lcm mid2 operatorname

Codeforces Global Round 23

比赛传送门

【E1. Joking (Easy Version)】

很有趣的一道题目!

\(\operatorname{Observation 1}\):YESNO 可以互相转化,对某个集合回答 YES 相当于对其补集回答 NO

\(\operatorname{Observation 2}\):两次回答中至少有一次在说真话,如果连续两次都对某个集合回答了 NO,我们就可以确定 \(x\) 必不在该集合中。

考虑将 \(n (n \geq 4)\) 个数的范围缩小。记 \(\operatorname{mid}\) 为 \(1 - n\) 的中点,考虑询问集合 \([1, \operatorname{mid}]\),如下图所示:

如果答案为 YES,记 \(\operatorname{mid'}\) 为 \(\operatorname{mid} - n\) 的中点,询问集合 \([\operatorname{mid}, \operatorname{mid'}]\):

这时,如果答案为 YES,由 \(\operatorname{Observation 2}\) 就可知道 \(x\) 必不在 \([\operatorname{mid'}, n]\) 当中!

对于其他情况类似讨论一下即可,我们能够很轻易写出如下的代码:

int mid = (l+r)>>1;
query(l, mid); cin >> s;
if (s == "YES") {
    int mid2 = (mid+r)>>1;
    query(mid+1, mid2); cin >> s;
    if (s == "YES") {
	change(mid2+1, r);
	r -= (r-mid2+1);
    } else {
	change(mid+1, mid2);
	r -= (mid2-mid);
    }
} else {
    int mid2 = (l+mid)>>1;
    query(l, mid2); cin >> s;
    if (s == "YES") {
	change(mid2+1, mid);
	r -= (mid-mid2);
    } else {
	change(l, mid2);
	r -= (mid2-l+1);
    }
}

query 函数和 change 函数可以在下方的提交记录中查看)

这时,我们就用两次询问缩小了 \(\frac{1}{4}\) 的范围,这太妙了,递归下去就能解决这个问题......吗?

此时又出现了一个 bug,当范围缩小至 \(n = 3\) 时怎么做?这就有点难了,设三个数分别为 \(a_1, a_2, a_3\),具体步骤如下:

  1. 询问集合 \(\{a_1, a_2\}\),
    • 如果回答是 NO,那么我们就认为 \(x = a_3\),提交一次答案,
      • 如果猜中了,游戏结束。
      • 如果猜错了,我们的范围就缩小至 \(\{a_1, a_2\}\) 中。同时,我们知道上一次的回答在 Joking,下一次询问就必定会说真话!接下来就很容易了,询问集合 \(\{a_1\}\) 便能知道 \(x\),提交答案,游戏结束。
    • 如果回答是 YES,请继续向下看,
  2. 再次询问集合 \(\{a_1, a_2\}\),
    • 如果回答是 NO,同上处理,不再赘述。
    • 如果回答是 YES,由 \(\operatorname{Observation 2}\) 可知 \(x \neq a_3\),于是我们的范围缩至了 \({a_1, a_2}\)!依次提交 \(a_1\)、\(a_2\) 作为 \(x\) 即可。

注意要特判 \(n = 1\) 哦!

提交记录


【F. Kazaee】

神题。看上去像一道高级数据结构题,实际上解法很简单。

考虑给每个数赋一个随机值,准确来说是把每一个相同的数随机映射成另一个数,可以发现:

  • 若区间内所有数的出现次数都为 \(k\) 的倍数,那么和也必定是 \(k\) 的倍数。
  • 若区间内所有数的出现次数不为 \(k\) 的倍数,和也有可能是 \(k\) 的倍数。不过均摊下来,错误率大概只有 \(\frac{1}{k}\) 左右。

使用树状数组维护即可。

思考正确性:\(k\) 等于 \(1\) 时必定都为 YES,所以只需考虑 \(k \geq 2\) 的情况。可以随机映射 \(30\) 次,这样错误率最多只有 \(\frac{q}{2^{30}}\) 左右,可以通过。

具体实现上,如果使用 map 进行映射会被卡常。我的解决方案是写关于 \(x\) 和映射到的数 \(T\) 的一个伪随机式子,可以达到相同的效果。

实测,每次随机时可以取一个数 \(arg\),对于每个数取 \(T = arg^{a_i}\) 正确率比较高,这样复杂度就是 \(O(kn \log n)\),其中 \(k = 30\)。

这样做仍然被卡常了!所以可以先对 \(a_i\) 离散化,这样算幂的时候就不用快速幂了,直接预处理即可。复杂度仍然是 \(O(k n \log n)\),不过这时瓶颈在于树状数组而不是快速幂了,常数很小,跑得飞快。

题外话:CSP 前没补这题,结果 CSP T3 就考到了与这题 几乎完全一致 的解法,亏大了 /ll

提交记录


Codeforces Round #829 (Div. 1)

比赛传送门

【C. Wish I Knew How to Sort】

\(\operatorname{Key Observation}\):设序列中 \(0\) 的数量为 \(\operatorname{cnt}\),只有前 \(\operatorname{cnt}\) 位中的 \(1\) 和后 \(n - \operatorname{cnt}\) 位中的 \(0\) 交换 有意义

然后瞎 dp 就行啦。我们设 \(\operatorname{dp}_i\) 表示形成前 \(\operatorname{cnt}\) 位中有 \(i\) 个 \(0\) 的期望步数,可以推出转移方程:

\[\operatorname{dp}_{i+1} = \operatorname{dp}_i + \frac{n(n-1)}{2(\operatorname{cnt}-i)^2} \]

提交记录


【D. The Beach】

待填坑...


Codeforces Round #832 (Div. 2)

比赛传送门

【D. Yet Another Problem】

分类讨论题,和 CSP-S 2022 T2 有的一拼。

  1. 如果区间内全为 \(0\),则答案为 \(0\)。
  2. 如果区间 \(\operatorname{xor}\) 不为 \(0\),则答案为 \(-1\)。
  3. 其余情况中,如果区间长度为奇数,则答案为 \(1\)。
  4. 其余情况中,如果 \(a_l = 0\) 或 \(a_r = 0\),则答案为 \(1\)。
  5. 其余情况中,存在 \(i \in [l, r]\),使得区间 \([l, i]\) 符合题目中的条件,则答案为 \(2\)。
  6. 其余情况中,答案为 \(-1\)。

如果暴力模拟复杂度是 \(O(nq)\),瓶颈在第五步,需要优化。

考虑对前缀和(或者叫前缀 \(\operatorname{xor}\) ?)排序,把相同的位置拎出来,预处理对于每个位置 \(i\),使 \([i, j]\) 满足条件的最小的 \(j\),就可以达到 \(O(n \log n + q)\) 的优秀复杂度,可以通过。

提交记录


【E. List Generation】

待填坑...


Codeforces Round #561 (Div. 2)

【D. Cute Sequences】

待填坑...

【E. The LCMs Must be Large】

结论题。

\(\operatorname{Key Observation}\):答案为 possible 的充要条件任意两天选取的商铺集合都有交集。

必要性证明

假设两个集合 \(A, B\),没有交集,这时我们可以发现 \(A \subseteq C_uB, B \subseteq C_uA\),故 \(C_uB\) 集合的 \(\operatorname{lcm}\) 必不小于 \(A\) 集合的 \(\operatorname{lcm}\),\(B\) 集合的 \(\operatorname{lcm}\) 必不大于 \(C_uA\) 集合的 \(\operatorname{lcm}\)。这时,如果 \(A\) 集合的 \(\operatorname{lcm}\) 大于 \(C_uA\) 集合的 \(\operatorname{lcm}\),即可推出 \(B\) 集合的 \(\operatorname{lcm}\) 小于 \(C_uB\) 集合的 \(\operatorname{lcm}\),矛盾,故任意两个集合间必定存在交集。

充分性证明

考虑这样一种构造,假设所有元素初始时全部为 \(1\),每次把给定的第 \(i\) 个集合内所有数都乘上第 \(i\) 个质数即可。可以发现,当集合两两相交时,这种构造总是对的。

提交记录

标签:记录,mid,CF,集合,YES,lcm,mid2,operatorname
From: https://www.cnblogs.com/SparkleZH-Blog/p/16858733.html

相关文章

  • CF1750E 题解
    没看懂官方社论,只好自力更生了。我们很容易知道,对于一段区间,其代价就是多余的括号数(左右括号中多出来的括号数)加上不属于多余括号,但没有匹配的左或右括号数。即左括号总量......
  • CF1252K Addition Robot 题解
    题目链接思路对于\(A=A+B\),\(B=A+B\)这种的递推式可以考虑矩阵加速递推,可得:\[\left(\begin{matrix}A+B&B\end{matrix}\right)=\left(\begin{ma......
  • CF464D World of Darkraft - 2 题解
    期望好题,可以帮助我们更加深入地了解期望。由于\(k\)种装备相同,所以只要计算卖掉一种装备得到的金币期望乘以\(k\)就行了。为了避免讨论当前状态的概率,期望DP通常......
  • CentOS 7 升级OpenSSH 9.1p1记录
    因服务器被扫描出漏洞,需要对OpenSSH升级,遇到一些波折,记录如下。安装配置telnet服务OpenSSH用于远程登录,一旦升级失败用不了,将无法远程登录,安装telnet-server备用。yumi......
  • CF1316E Team Building 题解
    可能更好的阅读体验题目传送门题目大意传送门你需要组建一支排球队。为了组织一支排球队,你需要为队伍里的\(p\)个不同的位置,从\(n\)个人中选出\(p\)个人,且每个位......
  • CF 刷题计划 2
    前言CF刷题计划不知不觉离之前的刷题计划都过去半年多了,水平也提升了不少,不得不感叹时间流逝。快NOIP了,感觉学新算法没什么用,就回来刷点CF吧。那就接着之前的编号,继......
  • CF1735E题解
    钦定\(p_1=0,p_2>0\),不难证明如果有解则一定存在\(p_2>p_1\)的解。考虑枚举和\(d_{1,1}\)是相同楼房,则\(p_2\)对于每一种情况有两种可能的位置:\(d_{1,1}+d_{2,i}\)......
  • [VP记录]AGC002
    以后养成一个好习惯,每天做一套agc。[AGC002A]RangeProduct入门。inta,b;intmain(){scanf("%d%d",&a,&b);if(a>b)swap(a,b);if(a<=0&&b>=0)puts("Ze......
  • [VP]CF794 Div2
    A.EverythingEverywhereAllButOne题意:给你一个序列,问是否可以选出其中\(n-1\)个数,使其平均值与剩下的那个数相等(\(n\leqslant50\))解法:暴力枚举点击查看代码#......
  • CF1684F Diverse Segments
    本题的问题等价于删除一个区间之后是否询问的所有区间都没有相同的数对。记录\(i\)的\(minL_i\)表示包含\(i\)的区间的最小左端点\(maxR_i\)同理,每次删除\(i\)......