Codeforces 补题记录

首先总结一下前段时间遇到过的一些有意思的题。

Round #474 (Div. 1 + Div. 2, combined)   Problem G

其实关键就是n这个数在排列中的位置。

这样对于一个排列,设$f[pos] = p$, 那么从位置$1$到位置$pos$最大值被刷新了$a$次,从位置$n$到位置$pos$最大值被刷新了$b$次。

去掉$n$之后,剩下$n-1$个数被分成了两个部分。

假设把这$n-1$个数分成$a+b-2$个组,分配给左边$a-1$个组,给右边$b-1$个组。

对于$n$左边的数,每个组内部一定满足第一个数最大,对于$n$右边的数,每个组内部一定满足最后一个数最大。

这样就满足了题意。

这样其实就是一个环排列计数,具体一点,就是求$n-1$个数划分成$a+b-2$个集合,每个集合内部再按特定顺序围圈分组的方法的数目。

这刚好是第一类斯特林数。那么答案为$C(a + b - 2, a - 1) * S(n - 1, a + b - 2)$。

Round #480 Div2  Problem E

去掉$k$个点,相当于保留$n - k$个点,需要满足剩下的$n - k$个点连通。转化为保留$m$个点,求留下的点的权值和最大。

以$n$为根(必选),从$n - 1$开始往前选,假设当前已经选了$x$个点,如果当前点往上爬,爬到第一个已经被选的点时的移动距离大于$m - x$,

那么不能选这个点(因为选了一个点就必须选他的祖先),否则就选入这个点,然后选择所有的他的祖先中未被选择的点

(也是一步步往上爬,到发现了被选中的点为止),到选了$m$个点为止结束即可。

Round #482 (Div. 2) Problem D

预处理出所有数的因子。加入一个数的时候在以他的所有倍数为编号的字典树中插入这个数,(字典树编号最大为$100$)

查询的时候如果$k$小等于$100$,那么在字典树里查询,否则直接暴力找。

原文地址:https://www.cnblogs.com/cxhscst2/p/9061855.html

时间: 2024-08-30 18:34:24

Codeforces 补题记录的相关文章

Codeforces 刷题记录

Codeforces 每日刷题记录 打'+'是一些有启发意义的题目,部分附上一句话题解,每日更新3题,大部分题目较水. 1.+CF1073E:状压,数位dp,官方题解std骚操作 2.CF1072A 3.CF1072B 4.CF1072C 5.CF1068C:读题恶心 6.CF1073D:猜复杂度,模拟 7.CF1088A 8.CF1088B 9.CF1088C:构造思想 10.CF1066A 11.CF1066B 12.CF1066C 13.+CF1088E:推结论,tree dp,贪心 14

Codeforces Round #617 (Div. 3) 补题记录

1296A - Array with Odd Sum 题意:可以改变数组中的一个数的值成另外一个数组中的数,问能不能使数组的和是个奇数 思路:签到,如果本来数组的和就是个奇数,那就OK 如果不是,就需要把数组中其中一个奇(偶)数改成偶(奇)数,相当于加一减一 所以测一下这个数组如果有个奇数并且还有个偶数就行 #include <cstdio> #include <iostream> #include <map> #include <set> #include

codeforces补题:979

codeforces 979b::: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+100; 4 int n; 5 char s[maxn]; 6 int num[100];//Kuro Shiro Katie 7 int ansl[5]; 8 9 int solve(){ 10 scanf("%s",s+1); 11 memset(num,0,sizeof(num)); 12 i

codeforces刷题记录

Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) C. Magic Grid 这种题直接构造 数n是2的n次方的倍数的时候可以这样划分数 比如n是4的倍数  n=k*4 000        001         010         011 100        101         110         111 (k-1)00   (k-1)01   (k-1)10   (k-1)11 然后填格子 Codeforces R

Codeforces补题2020.3.4 (Round620 Div2)

A.Two Rabbits Gildong厌倦了参加过多次Codeforce攻击,决定在公园休息一下.他坐在长凳上,很快他发现两只兔子在跳来跳去.一只兔子比另一只更高. 他注意到两只兔子在互相跳来跳去.两只兔子的位置可以表示为水平线上的整数坐标.较高的兔子当前位于位置x,而较短的兔子当前位于位置y(x <y).每秒钟,每只兔子跳到另一个位置.较高的兔子跳向a的正向,而较短的兔子跳向b的负向. 例如,假设x = 0,y = 10,a = 2和b = 3.在第1秒,每只兔子将在位置2和7.在第2秒,

牛客练习赛1 补题记录

A 矩阵 中文题意,要找一个最大的k阶子矩阵在原矩阵中出现过两次. 需要将这个矩阵进行Hash,也就是需要二维Hash,先把每一行Hash了,再把每一列Hash了,有一点前缀的感觉. 预处理完Hash值之后,二分答案k,check过程是在$O(n ^ 2)$枚举起点,这里其实枚举终点方便一些,边界比较好处理,把每个k阶矩阵的hash值存下来,最后看有没有两个一样的. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int

多校01_补题记录

1001 题意:int n ,存在x,y,z∈int,满足x+y+z=n,s.t. x*y*z取到最大值,求最大值 最早是用猜的...3的倍数显而易见,试了前20个发现凡4的倍数都能拆成1 1 2的倍数之和..._(:з」∠)_... 正经解法: 令r=n/x ,s=n/y ,t=n/z ,则 n/r+n/s+n/t=n ,即1/r+1/s+1/t=1 求解可得(3,3,3),(2,4,4),(2,3,6)三种情况,即3|n or 4|n AC代码: 1 #include<cstdio> 2

Codeforces VP/补题小记 (持续填坑)

Codeforces VP/补题小记 1149 C. Tree Generator 给你一棵树的括号序列,每次交换两个括号,维护每次交换之后的直径. ? 考虑括号序列维护树的路径信息和,是将左括号看做 \(-1\) ,右括号看做 \(1\) ,那么一段竖直向上的路径可以表示为括号序列的一个区间和,一段竖直向下的路径可以看做括号序列的一个区间和的相反数.我们要维护的是树的直径,也就是一段连续的和减去紧随其后的一段连续的差.具体来说就是 \[ \max_{\forall [l,r]}\{\sum_{

Codeforces Round #634 (Div. 3) 补题

A. Candies and Two Sisters 签到题,直接输出即可 代码 #include<bits/stdc++.h> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; inline void read(int &p) { p=0;int flag=1;char c=getchar(); while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();} w