Codeforces Global Round 7 题解

A

一种合法构造方式是\(299\cdots 9\)

code

B

发现每次的\(x_{i-1}\)都是知道的,于是可以直接递推。

code

C

最终答案所选的数一定是\(n-k+1\)到\(n\)的所有数。把这些数所在的位置记作\(p_1,p_2,\cdots,p_k\). 不难发现每个\(r_i\in [p_i,p_{i+1})\),于是答案就是\(\prod (p_{i+1}-p_i)\).

code

D

首先把首尾能构成回文的部分删掉,因为这部分一定会出现在答案中。

问题变成了在当前字符串中选取一个前缀/后缀,使其为回文串且长度尽可能长。这个可以使用manacher/hash/回文自动机实现。这里笔者使用的是双hash(欢迎来hack)

code

E

注意到答案是单调不升的,我们可以从大到小扫一遍并判断当前答案是否成立。

考虑对于一个数\(x\)它何时不能成为答案:对于从右往左数的第\(i\)个比\(x\)大或相等的数,其右边至少有\(i\)个炸弹。

我们考虑维护\(b_i\)为位置\(i\)右边大于\(b_i\)的大于等于当前答案的数减去\(i\)右边炸弹的数量。当\(\max(b_i)\leq 0\)时说明当前的答案过大。

对\(b_i\)的维护可以使用线段树。

code

F

记\(f_s\)是构成串\(s\)的方案数。直接\(f_s\)求显然过于复杂,我们考虑容斥的想法,令\(F_s\)表示构成串\(s\)的数量,其中\(s_i=1\)表示\(p_i\)与\(p_{i+1}\)相互认识,\(s_i=0\)表示不限制\(p_i\)与\(p_{i+1}\)的关系。不难发现有\(F_s=\sum_{s\subseteq t}f_t\).这样我们可以求出\(F\),之后直接用FWT求出\(f\).

这样转化之后有一个重要的性质:我们可以忽略原串的位置限制,而是将\(n\)个人划分成若干个等价类\(p(1),p(2),\cdots,p(k)\).每个等价类中的所有人需要连成一条链,等价类之间的边会随着当前的串\(s\)而唯一确定。举一个例子:\(F_{1100111}=F_{0111011}\).这个性质的重要之处在于大大压缩了有效状态数,有效状态数为\(n\)的划分数,大致在几百左右。

先考虑一个简单的问题:如何对单个等价类求答案。我们记\(G_s\)表示将集合\(s\)中的人连成一条链的方案数,这个的转移比较简单,记\(g_{s,i}\)为集合\(s\)中的人连成一条以\(i\)结尾的链的方案数,对\(g\)暴力转移之后有\(G_s=\sum_{i\in s}g_{s,i}\).

接下来考虑如何通过\(G\)求\(F\)(注意此时\(F\)的下标对应着\(n\)的每一种划分方案).可以把答案写成这样

\[\sum_{\sum_{i=1}^k |p(i)|=n \ \forall i,j\ p(i)\bigcap p(j)=\empty\
}\prod_{i=1}^k G_{p(i)}
\]

枚举\(n\)的每一种划分方案,将条件2转化为\(\bigcup p(i)=\{1,2,\cdots,n\}\),这样的话可以直接对\(G\)做一遍\(or\)的FWT来求出\(F_i\).在实现上,可以将原来的\(G_s\)变形为\(G_{|s|,s}\),然后在枚举划分的时候将对应的\(G_{i,s}\)算上即可。

最后枚举\(s\),根据FWT的结果求出\(F_s\),再求出\(f_s\)即可。具体实现可参照程序。

code

原文地址:https://www.cnblogs.com/encodetalker/p/12602482.html

时间: 2024-07-29 13:03:05

Codeforces Global Round 7 题解的相关文章

codeforces global round 1题解搬运

A,B很简单,跳过了. C题规律相当明显,可以直接对\(2^n-1\)打表,也可以不打表直接算最大因数. D题两种操作转化一下DP即可. E题考虑查分数组不变的性质. F题考虑dfs时动态维护每个叶子的深度,从一个节点走向它的孩子相当于孩子对应的区间加,不包含孩子的区间减. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int P=1050000; const int N=500010; in

Codeforces Global Round 3 题解

A 送分题 B 送分题 C 考虑先依次把\(2\sim n-1\)换到正确的位置,这个只要利用\(1,n\)两个位置交换就行了. 然后如果\(n\)在第一位就交换\(1,n\). D 显然\(a<b\)和\(a>b\)的可以分别考虑.不失一般性考虑\(a<b\)的.那么相当于要选出若干二元组并排序,要求满足\(b_i>a_{i+1}\).考虑对数值建点,\(a\)向\(b\)连边,所有\(i\)向\(i-1\)连边,相当于要走一条路径经过最多\(a->b\)的边.这样可以直观

Codeforces Global Round 4 题解

技不如人,肝败吓疯…… 开场差点被 A 题意杀了,幸好仔细再仔细看,终于在第 7 分钟过掉了. 跟榜.wtf 怎么一群人跳题/倒序开题? 立刻紧张,把 BC 迅速切掉,翻到了 100+. 开 D.感觉有点吓人……感觉有点可做? 的确挺可做.再切掉 D,但是此时已经到 300+ 了. 没事,还能翻. 开 E.这……什么玩意? 瞄了一眼 F1,…… 盯着这两题盯到自闭. 最后 rk 1000 左右.我的名字颜色真的是对的吗…… A 看懂题了就是水题.选上所有小于等于第一个党派一半人数的党派,如果不行

Codeforces Global Round 1 (A-E题解)

Codeforces Global Round 1 题目链接:https://codeforces.com/contest/1110 A. Parity 题意: 给出{ak},b,k,判断a1*b^(k-1)+a2*b^(k-2)+...+ak*b^0的奇偶性. 题解: 暴力求模2意义下的值就好了. 代码如下: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+5; int

【手抖康复训练1 】Codeforces Global Round 6

[手抖康复训练1 ]Codeforces Global Round 6 总结:不想复习随意打的一场,比赛开始就是熟悉的N分钟进不去时间,2333,太久没写题的后果就是:A 题手抖过不了样例 B题秒出思路手抖过不了样例,C题秒出思路手抖过不了样例*3 D题 手抖 过的了样例 ,调了1h,赛后发现变量名写错了,改一个字符就能AC... 题目等补完题一起放上来QAQ 原文地址:https://www.cnblogs.com/ttttttttrx/p/12110199.html

Codeforces Global Round 7【ABCD】(题解)

目录 涵盖知识点:思维.构造.马拉车. 比赛链接:传送门 D题只有数据范围的区别,故只写D2. 好多题啊,随缘更新.(其实懒得写) A - Bad Ugly Numbers B - Maximums C - Permutation Partitions D2 - Prefix-Suffix Palindrome (Hard version) 涵盖知识点:思维.构造.马拉车. 比赛链接:传送门 D题只有数据范围的区别,故只写D2. 好多题啊,随缘更新.(其实懒得写) A - Bad Ugly Nu

Codeforces Global Round 5 部分题解

tourist的劲题,掉了17分,着实心痛,本来是有分可恰到的 A.给你一个数列\(a\),你需要构造一个数列\(b\),使得每一个\(b\)都等于\(a/2\),向上或向下取整由你决定 并且还要使得\(\sigma b\)的总和等于0 数据是保证有解的 那么我们就令所有\(b\)等于\(\lfloor a/2 \rfloor\),求出总和 再遍历一遍数组,sum过大则把某些负数调整为向上取整,否则把正数调整 代码: #include <bits/stdc++.h> #define int l

【 Codeforces Global Round 1 B】Tape

[链接] 我是链接,点我呀:) [题意] x轴上有m个连续的点,从1标号到m. 其中有n个点是特殊点. 让你用k段区间将这n个点覆盖. 要求区间的总长度最小. [题解] 一开始假设我们需要n个胶带(即包含每一个点) 然后因为k<=n 所以可能胶带不够用. 那么就得一个胶带跨过两个点. 怎么选择最好呢? 可以把b[i]-b[i-1]-1处理出来排个序. (优先取较小的花费) 然后取前n-k个累加和sum. 因为每取一个就少用一段胶带. 然后sum+n就是答案了 [代码] import java.i

【Codeforces Global Round 1 C】Meaningless Operations

[链接] 我是链接,点我呀:) [题意] 给你一个a 让你从1..a-1的范围中选择一个b 使得gcd(a^b,a&b)的值最大 [题解] 显然如果a的二进制中有0的话. 那么我们就让选择的b的二进制中对应的位置为1 剩下全为0就好 这样a的二进制全都变成1之后就是答案了(gcd的右边是0). 但是如果a的二进制里面全是1的话. 就没办法这么构造了 这里有两种情况. ①.1的个数是偶数 那么就101010这样构造 另外一个数就是010101 答案就是010101转换成十进制 ②.1的个数是奇数