Codeforces Round #423(div 2)

A

=w=

B

QvQ

C(并查集)

题意:

你需要根据要求构出一个字符串S

输入n个子串以及这些子串在S中出现的位置(有多个位置),输入数据保证不冲突

然后你根据这些已知子串去构一个字典序最小的S(也就是没涉及的位置填‘a‘)

最终S的总长度<=2e6

分析:

不能直接暴力模拟,那样会TLE

给位置涂色的过程中将相邻的块用并查集合并,父亲是当前块最右边的那个位置

这样就可以保证每个位置最多遍历一次了

时间复杂度O(αlen)

D(构造)

题意:

给出n,k(n,k<=2e5)

可以构造出一个n个点的无根树,并且这个无根树叶子节点的个数是k

那么在这么些合法的树中,你需要找出一个树,叶子节点之间距离的最大值最小

分析:

我们希望它们之间的距离越平均越好

容易发现从根节点分出k个枝杈,然后每个枝杈尽可能平均地挂链,这样的树可以使得叶子节点之间距离的最大值最小

E(树状数组)

题意:

给出一个由A G C T组成的字符串S(|S|<=1e5)

有q(q<=1e5)个操作:

  操作1:将一个位置的字符修改

  操作2:读入l,r,e,e是一个长度<=10的字符串。字符串T=S[l..r],字符串E=eeeeeeeeeeee....,将T和E对比,计算有多少个位置i满足T[i]=E[i]

分析:

首先考虑没有修改操作

对于询问可以枚举e的每一位,那么就是询问一个等差序列与原串S对应位置的重合情况

可以对原串S预处理,数组c[id][i][j][]表示对于字符id,当公差是i的时候(明显公差<=10),首项是j的时候(j<=i),每个位置是否有字符id(0或者1)

那么对于询问其实就是求区间和,那么就求前缀和相减就行了

现在考虑修改操作

修改操作是:修改一个位置,询问区间和

所以直接BIT

时间复杂度O(4*10*10*len*log(len))

F

待填坑

时间: 2024-10-13 02:32:27

Codeforces Round #423(div 2)的相关文章

Codeforces Round #423 (Div. 2) C 思维,并查集 或 线段树 D 树构造,水

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction   思维,并查集 或 线段树 题意:一个字符串被删除了,但给出 n条信息,要还原出可能的字典序最小的字符串.信息有:字符串ti,ki个位置xi,表明原本的字符串在xi位置是以字符串ti开头的. tags:惨遭 fst,一开始把所有字符串都存下来,排序做的,结果爆内存了.. 方法1: 考虑并查集,对于字符串 ti,在位置xi,

Codeforces Round #423 (Div. 2) D. High Load(构造题)

题目链接:Codeforces Round #423 (Div. 2) D. High Load 题意: 给你一个数n和k,让你构造出一颗树,有k个叶子节点,使得这棵树的任意两个点的距离的最大值最小. 题解: 显然要使得这棵树的任意两个点的距离的最大值最小,每个点离树根越近越好. 然后要求有k个叶子节点,所以我就任意选一个点为根,然后构成一棵m叉的树就行了. 最大距离的最小值就是离根最远的和最近的加一加就行了. 1 #include<cstdio> 2 #define F(i,a,b) for

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem A - B

Pronlem A In a small restaurant there are a tables for one person and b tables for two persons. It it known that n groups of people come today, each consisting of one or two people. If a group consist of one person, it is seated at a vacant one-seate

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals)D. High Load

题意:出n个点,其中k个叶子节点,问构造出的树最远的两个点最近是多少 思路:以一个点为中心,然后m个伸出,一层层扩散,(n-1)%m==k,如果k==0,即可以平分,长度就是2*(n-1)/m,如果取模为k==1,说明多出一个,+1,其他的话,就是最后一层补k个,但是最长的还是+2 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int n,m; 6 cin>>n>>m; 7 int

Codeforces Round #423 (Div. 2) A-C

A. Restaurant Tables 这里看错题意还wa了两发.... 按题意模拟就行了 水题 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <iomanip> #include <math.h> #includ

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) B. Black Square

题意:问是否可以形成一个全黑正方形 思路:可以找出正方形的边,然后判断下这个矩阵是否容得下,n,m都比边短,比赛的时候写麻烦了,还去找了这个正方形究竟在哪个位置,这样的话得考虑很多情况,不如就边*边-黑子的总数 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=2e5+10; 5 char a[102][102]; 6 int main(){ 7 int n,m; 8 s

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction

题意:给出各个字符串出现的起始位置,问整个的字符串是什么,(字典序最小) 思路:开始写的是用set+优先队列存取每个位置出现的最长字符串,然后遍历,爆内存...爆...内...存...我们可以用并查集,已经确认的位置他们并在一起,指向后面第一个没有被确认的(看代码理解吧) 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=2e6+10; 4 5 int n,fa[N]; 6 char s[N],b[N]; 7 8 in

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E DNA Evolution

DNA Evolution 题目让我们联想到树状数组或者线段树,但是如果像普通那样子统计一段的和,空间会爆炸. 所以我们想怎样可以表示一段区间的字符串. 学习一发大佬的解法. 开一个C[10][10][4][n],就可以啦,第二维表示e的长度,第一维表示i%e的长度,第三维表示颜色,第四维求和了. 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e5+5; 4 char s[maxn]; 5 map&l

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组

E. DNA Evolution time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standard output Everyone knows that DNA strands consist of nucleotides. There are four types of nucleotides: "A", "T", "