首页 > 其他分享 >Educational Codeforces Round 120

Educational Codeforces Round 120

时间:2024-03-04 15:12:45浏览次数:18  
标签:Educational le dfrac sum Codeforces times 120 text 2k


\[\large \text{Round 1 : Educational Codeforces Round 120 (VP)} \]

一言:
孤独的人不会伤害别人,只会不断地伤害自己罢了。
——我的青春恋爱物语果然有问题

\(\text{C: Set or Decrease }\)

后四题唯一场切题,(别问我为什么只有这一道)。

读完题之后,理一下思路,可以很容易的想到一种贪心思想,就是我们找到这个序列中最小的数,对他执行 \(x\) 次操作 \(1\),然后找到 \(m\) 个最大的数,将他们与最小的数执行一次操作 \(2\),这样必然是最优的。($ 0 \le x, 0 \le m \le n - 1$)。

首先对于符合题意的序列,输出 \(0\) 直接跳过。

接着我们求出要使得总和小于给定总和总共需要减去的数,即 \(sum - k\),设为 \(need\) 。然后定义 \(b\) 数组表示 \(b_i=a_i-a_1\),以及 \(sum_i\) 表示 \(b\) 数组的后缀和。

所以我们显然有 \(b_{n-m+1}+x \times (m+1) \ge need\)。

由于 \(x\) 可能很大,所以我们可以直接考虑枚举 \(m\),求得最小的 \(x\),然后将 \(m+x\) 取最小值即可。

\(\text{Submission}\)

\(\text{D: Shuffle}\)

对于这道题,我们可以非常容易的通过 \(n^2\) 的复杂度找到可以修改的所有区间,并对其进行修改。

但是很显然,这样是有重复的,这也是本道题的难点。

但是实际上,我们并不关心具体是那个区间修改了,我们可以直接枚举发生变化过的所有区间 \([l,r]\),如果两个端点保证改变了,那他就必然可以保证会与其他区间的变化不一样,所以接下来的目标就是要求对于区间 \([l,r]\),保证端点修改的方案数。(可以发现,只有 \([l,r]\) 之间 \(1\) 的个数小于等于 \(k\),且全局 \(1\) 的个数大于等于 \(k\),它才会被修改。)

对于 \(a_l,a_r\),必须填上与其原来不同的 \(0,1\),(如果填不上就特判无解),定义还可以填的 \(0,1\) 的个数分别为 \(num0,num1\),则方案就是 \(C(num0+num1,num0)\)。

最后累加起来就可以了。

\(\text{Submission}\)

\(\text{E: Math Test}\)

看见这个绝对值就很不爽,我们可以考虑对于每个人定义一个数组 \(c_i \in \{ -1,1 \}\),并暴力搜索得到每个人的 \(c_i\) 是 \(-1\) 还是 \(1\)。

那么,我们就可以把答案重新定义为 \(\sum ^n _{i=1} c_i \times (r_i - x_i)\),假设第 \(i\) 道题目的得分为 \(e_i\),\(a_{i,j}\) 表示第 \(i\) 个人的是否答对了第 \(j\) 道题。

接着我们对这个式子进行一系列的恒等变形:

\[\begin{aligned} ans&=\sum ^n _{i=1} c_i \times (r_i - x_i) \\ &=\sum ^n _{i=1} c_i \times r_i - \sum ^n _{i=1} c_i \times x_i\\ &=\sum ^n _{i=1} c_i \times r_i - \sum ^n _{i=1} c_i \times \sum _{j=1} ^ m a_{i,j} \times e_j\\ &=\sum ^n _{i=1} c_i \times r_i - \sum ^m _{i=1} \left( \sum _{j=1} ^ n a_{j,i} \times c_i\right) \times e_j \end{aligned} \]

可以发现,减号之前部分是定值,右边括号内也是定值,要使右边减的越小,则根据排序不等式,则括号内值越小,\(e\) 的值就越大。

虽然但是,这样并没有结束,你会发现有一些不合法的方案,就是你求出来 \(e\) 之后,还原回去,会发现他绝对值取正负并不与 \(c\) 数组匹配,也就是有可能存在一个人他的 \(c_i \times (r_i-x_i)\) 可能是个负数。但显然,如果他是个负数,那么将 \(c\) 数组取反就必然会得到正确的答案,也就是说,必然会有其他情况比该情况更优,所以这个不合法情况永远成不了最优解。

所以最终复杂度 \(2^nmn+2^nm\log m\) 在 CF 神机下乱过。

\(\text{Submission}\)

\(\text{F: Quadratic Set}\)

题目给到了两个关键信息,阶乘的连乘,完全平方数。那我们就希望能不能将阶乘的连乘简化为一个完全平方数再乘一些数。

实际上还真就可以简化。有以下恒等式:

\(\prod _{i=1} ^ {2k} i! = \left (\prod_{i=1}^k (2k-1)! \right)^2 \times 2^k \times k!\)

因为 \(\left(\prod_{i=1}^k (2k-1)! \right)^2= \prod_{i=1}^k (2k-1)! \times (2k)! \times \dfrac{1}{2k}\) ,还是比较好推的,就是确实不太好想到。

然后我们在通过一系列的样例观察,发现好像至少可以选出 \(n-3\) 个数,那我们根据上面的恒等式来证明一下。

首先对于 \(4 \mid n\),那我们令 \(k=\dfrac{n}{2}\),则只需要删去 \(\dfrac{n}{2}\) 即可符合条件。

接着对于剩余的 \(2\mid n\),我们仍然令 \(k=\dfrac{n}{2}\),则只需要删去 \(2,\dfrac{n}{2}\),即可符合条件。

对于剩余情况,显然 \(n\) 是奇数,我们令 \(k = \dfrac{n-1}{2}\),则只需要删去 \(2,\dfrac{n-1}{2},n\) 即可符合条件。

所以得证,但是并不一定是最优解。

我们定义 \(A=\prod _{i=1} ^ {n} i!\)

如果 \(A\) 是平方数,则输出所有的 \(n\) 个数。

接着枚举 \(1 \le i \le n\),如果 \(\dfrac{A}{i!}\) 是平方数,则输出 \(n-1\) 个除了 \(i\) 的数。

接着枚举 \(1 \le i \le n\),如果能够找到 \(j\) 满足 \(\dfrac{A}{i! \times j!}\) 平方数,则输出 \(n-2\) 个除了 \(i,j\) 的数。

否则输出 \(n-3\) 个不是 \(\dfrac{n-1}{2},2,n\) 的数。

但是你总不可以暴力求阶乘吧? 实际上,每个阶乘是不是平方数只与其的质因数分解后,每个质因数的个数是不是偶数有关,想到偶数,你是否有想到异或?

我们可以考虑给每个质因子赋一个哈希值,定义一个阶乘的 \(a_i\) 表示 \(i\) 的阶乘中质因数分解后所有质数哈希值的异或和。(如果每个质数有多个,那就都异或起来)显然可以递推处理。

显然,如果 \(B=a_1 \oplus a_2 ... \oplus a_n=0\),则就满足最初的 \(A\) 是平方数。如果 \(B \oplus a_i = 0\),也就找到了\(\dfrac{A}{i!}\) 是平方数。对于最后一种情况,可以用 \(map\) 处理,即每次将 \(a_i \oplus B\),放入 \(map\) 中,每次查 \(map\) 中是否存在 \(a_i\),一旦存在就满足\(\dfrac{A}{i! \times j!}\) 平方数。

时间复杂度 \(n\log n\)。

\(\text{Submission}\)

\(\text{What I learned:}\)

  • 如果你发现当你求方案加和时存在重复方案,则可以考虑将每次将要求解的子问题多限定一些条件达到去重目的。

  • 你要求最值,但是通过你的办法求出时可能存在不满足题目条件的,那你可以想想这些解有没有可能是最优的。

  • 多观察样例找规律。

  • \(\prod _{i=1} ^ {2k} i! = \left (\prod_{i=1}^k (2k-1)! \right)^2 \times 2^k \times k!\) 。

  • 排序不等式。

  • 如果要看一个数出现了奇数次还是偶数次,请别忘记异或。

  • 如果判断一个数出现次数的奇偶性仅仅通过异或的话,可能会出现另外的数把当前数给异或掉了,所以此时可以考虑哈希来尽量避免这种重复。

标签:Educational,le,dfrac,sum,Codeforces,times,120,text,2k
From: https://www.cnblogs.com/SFsaltyfish/p/18051848

相关文章

  • Codeforces Round 893 (Div. 2)
    \[\large\text{Round3:CodeforcesRound893(Div.2)(VP)}\]一言:从你站在桥上看我的那一刻起你就是我的世界——火影忍者不是很满意,还是没有突破\(\text{D}\)题,确实是没有想到这题竟然如此毒瘤。。\(\text{D:TreesandSegments}\)首先不难想到一种思路,就是枚举......
  • Codeforces Round 806 (Div. 4) A-G(补题)
    A.YESorYES?思路:一次判断三个字母是否是y、e、s的大小写即可。这题是很久前写的,哈哈,马蜂改了不少。。#include<bits/stdc++.h>usingnamespacestd;intn;chars[5];intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++){ scanf("%s",s+1); if......
  • 16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(递归、思维
    C.MinMaxSort很不错的一道题目,不过脑电波和出题人每对上,\(qwq。\)正难则反。我们考虑最后一步是怎么操作的。最后一步一定是对\(1\)和\(n\)进行操作那么上一步呢?上一步应该是对\(2\)和\(n-1\)以此类推第一步应该是对\(\frac{n}{2}\)和\(\frac{n}{2}+1\)我们的答案应该......
  • Educational Codeforces Round 143 (Rated for Div. 2)C. Tea Tasting(前缀和+二分、
    C.TeaTasting思路这里枚举有三种思路然后经过考虑3是最可行的,然后接着考虑如何计算贡献这里在实现的时候用了一个差分数组,因为我们需要记录第i个茶师它喝了多少个\(b_i\)以及不满\(b_i\)的用\(c_i\)记录,最后计算一下答案即可。#include<bits/stdc++.h>#defineintlon......
  • Codeforces Round 930 (Div. 2)
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1937。被交互杀死的一集。赛时卡C明天有早八就直接睡大觉了,第二天看看D一眼秒了,最困的一集。A签到发现1会被先后交换到2,4,8,16……输出\(2^{\left\lfloor\logn\right\rfloor}\)即可。......
  • Codeforces Round 931 (Div. 2) A-D2
    A.TooMinTooMax贪心、排序。对数组排序后,显然当下标\(i\)、\(j\)、\(k\)、\(l\)分别选择\(1\)、\(n\)、\(2\)、\(n-1\)时求得最大值。时间复杂度:\(O(nlogn)\)。#include<bits/stdc++.h>usingnamespacestd;#definecctieios::sync_with_stdio(0);cin.tie(0)......
  • Codeforces Round 926 (Div. 2)
    A-SashaandtheBeautifulArray难度:⭐题目大意给定一个长度为n的数组,其分数为An-An-1+An-1-An-2...+A2-A1;问如何排列可以让该数组的分数最大;解题思路就是让An-A1最大;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSio......
  • Codeforces Round 931 (Div. 2)
    CodeforcesRound931(Div.2)比赛链接A.TooMinTooMax思路这题一开始我以为就是简单的模拟一下,四个for循环可能就可以,事实上并不是,因为我们想让最后的值最大,所以我们可以将数组进行排序,之后我们从最左边取两个,最右边取两个,插着求绝对值的和就行Code#include<bits/stdc......
  • Codeforces Round 911 (Div. 2) vp D题
    前面三题,就B题一道900的题目让我wa了两发,而且有点难看出来主要是想不到。。不知道该怎么像。应该算是题目理解不清晰吧,很麻烦。。这个原因可以说是没有一个完整的思考路径,我能够直接想到答案接近的处理方法,但是细节上没有注意。在考虑问题的时候可能。。需要慢一些,太快了,容易漏......
  • CodeForces 1936D Bitwise Paradox
    洛谷传送门CF传送门和CF1004FSonyaandBitwiseOR很像。考虑一次询问怎么做。考虑分治,每次只计算左端点在\([l,mid]\),右端点在\([mid+1,r]\)的区间的贡献。对于每个\(i\in[l,mid]\),维护最小的\(j\in[mid+1,r]\)使得\([i,j]\)的或\(\gev\),那么\(\m......