Codeforces 691D Swaps in Permutation
链接
题意
给出\(1\)到\(n(1 \leq n \leq 1000000)\)的排列,再给出\(m\)对位置,这些位置上的数字可以相互交换,输出字典序最大的一个排列。
思路
每一对位置相当于一条边。构图后,将每个连通分量中点从小到大排列即可。
代码
1 |
|
给出\(1\)到\(n(1 \leq n \leq 1000000)\)的排列,再给出\(m\)对位置,这些位置上的数字可以相互交换,输出字典序最大的一个排列。
每一对位置相当于一条边。构图后,将每个连通分量中点从小到大排列即可。
1 | #include <cstdio> |
给出\(n(1 \leq n \leq 200000)\)个整数,依次输出所有长度为\(x(1 \leq x \leq n)\)的连续子序列最小值的最大值。
用单调队列求每个元素为最小的区间,然后对于每个长度求最小值的最大值。
1 | #include <cstdio> |
一队\(n\)个人,单位时间队首的人有\(p\)的概率出队,求\(t\)单位时间后出队的人数量的期望。
可以dp也可以使用数学二项分布公式,注意使用公式时要用对数优化精度。
概率dp:
1 | #include <cstdio> |
数学公式:
1 | #include <cstdio> |
给出\(n \times m, (1 \leq n, m, n \dot m \leq 1000000)\)的矩阵,对其进行处理,用正整数替换矩阵中数值,使得原本每行和每列中数的大小关系不变,且矩阵中的最大元素最小。
分别对列和行进行处理,对于每个阶段储存与其相邻的比它小或相等的元素。对元素排序后,对于每一个未赋值的元素,找出所有和它相等的在同一行或同一列的元素,对于所有找出的元素求比它们小的元素的最大值。
Tutorial里称这种做法为“lazy computations”。
1 | #include <cstdio> |
给出整数\(n,k(1 \leq n, k \leq 1000000)\),接着给出\(n\)个整数\(c_i\),在已知\(x \mod {c_i}\)的前提下,能否唯一的确定\(x \mod k\)。
将\(k\)进行分解,对于每个质数,如果都存在\(c_i\)中的质数的幂比\(k\)中的大,则能唯一的确定\(x \mod k\)。
1 | #include <cstdio> |
给出\(n \times n\)的由‘X’和‘.’构成的字符矩阵,求将一块边长为\(k\)的方形内的字符全都变为‘.’之后,最大的由‘.’组成的连通分量。\((1 \leq k \leq n \leq 500)\)
首先dfs求出所有连通分量,然后用滑动窗口进行求解。
1 | #include <cstdio> |
给出递推式\(f(x)=f(x-a^3)+1\)(其中\(a\)为满足\(a^3 \leq x\)的最大整数),给出一个\(m(1 \leq m \leq {10}^{15})\),求最大的\(f(x)\)和当\(f(x)\)最大时最大的\(x\)。
设所求\(f(x)\)为\(F(m)\),对于当前的\(m\),设\(a\)为满足\(a^3 \leq m\)的最大整数,考虑两种转移:
对于如上两种转移,可以递归求解。如果要转移至减去\({(a-2)}^3\),则变为\(F(m)=F({(a-1)}^3-1-{(a-2)}^3)+1\),由于\(F(m)\)单调不减,且\({(a-1)}^3-1-{(a-2)}^3 < a^3-1-{(a-1)}^3\),所以不考虑此转移。
1 | #include <bits/stdc++.h> |
有一个数字\(x,(1 \leq x \leq 100)\),程序可以最多询问20次,每次输出一个数字,系统会给出他是否为x的因子,最后要求输出\(x\)是否为素数。
检验给出的数字\(x\)的素因子个数,若有多个则为合数,如果只有一个,判断素因子的平方是否为\(x\)的因子,若为则为合数,不为则为素数。
1 | #include <bits/stdc++.h> |
原本有一个数字组成的字符串,现在给出将原字符串的长度附加在字符串后打乱的字符串,和原字符串的一个子串。输出字典序最小的原字符串,不允许有前导零。
设原字符串的子串为\(s0\),在原字符串中去掉\(s0\)之后的字符串为\(s1\),我们可以构造出两个字符串,最后比较输出。
\(ans1\):\(s1\)中最小的非0数字做第一位,升序排列剩余数字,然后对于每种数字检测应该放在\(s0\)之前还是\(s0\)之后,将\(s0\)插入到合适位置。
\(ans2\):\(s1\)升序排列后,把\(s0\)接在后面。
最后输出\(min(ans1, ans2)\),注意判断前导零。
1 | #include <cstdio> |
开场之后,我开始登PC^2,开比赛排行榜页面,开CB。
ZDL读到K是水题,跟我说我开始写,过了一会写完了,测了样例,提交WA。然后开始查错,过了挺久才查出来,多输出了个空格,K2y(12)。 然后ZDL说A水,跟我说式子,A1y(16)。
LRY说E是水题,跟我讲题意和思路,题意上一开始出了点问题,整理好思路之后,敲了交了一发WA。打印代码Debug。发现上界写错了,E2y(29)。
刷榜,发现有队伍过了B,10w的数据量应该不是暴力,LRY和我开始推式子,题目要求不相临,但似乎没有无解的时候,我跟LRY说了思路,每次找最大的减去,LRY感觉可行,写完交了一发,B1y(50)。
这个时候又读出来了I、F、G的题意。但感觉不是很简单。
ZDL上机写C。我开始读J,读题时,少看了一个词,导致一直没有看懂样例,读懂之后发现是水题。ZDL调代码卡了一下,打印代码。我上机写J,交了一发WA。发现式子写错一位数,修改之后,J2y(92)。
ZDL上机继续改C,LRY跟我讲G思路,他推了个式子,需要验证,手算了几个小数据感觉靠谱。又给我讲了F的DP思路,我也感觉靠谱。ZDL交了一发C,WA。我上机敲G的暴力,验证了几组大数据,感觉没什么问题,交了一发G1y(104)。
LRY查代码,我开始敲F,写了一半发现转移多了一维,跟LRY说,LRY继续思路。ZDL上机改C,LRY跟我讲了H的题意,我感觉时间挺长的,可以往后放一放。
ZDL改好C,C2y(112)。LRY跟我说最后一位转移可以优化掉,于是我继续敲F,LRY和ZDL读其他的题。
我敲好代码之后发现样例不过,LRY开始Debug,ZDL跟我讲了D题的思路,我刷榜发现排名靠后的队有出这道题的,感觉似乎可以暴力水过去,于是跟LRY和ZDL商量了一下,准备先交一发暴力,写了个下标优化的暴力排序,提交TLE。
LRY查完错,过了样例,交了一发WA。榜上又有了个队过了D,LRY说可以用合并有序表过,写了一发,D2y(174)。
然后LRY继续查F,ZDL跟我讲了L思路,类似于预处理后,对于查询求相对位置,直接输出。感觉比H好写,于是开始写L,写好之后,测试样例时发现过不了,和想的不一样,0不能向下转到9。于是开始想优化,发现似乎并不能搞。
LRY找F的错,一会帮LRY测F的数据,我开始想H的写法。LRY找到了个错,修改后提交WA,打印代码,我上机。
因为要测F的数据,H断断续续写了半个小时左右,LRY发现,F题应该写continue的地方写成了break。修改之后F3y(297)。
剩下的时间写H,写好后测了样例提交WA,一直修改到最后没改出来。
总体来讲,这次比赛我发挥的挺水的,开场的几次WA,直接就把整个队伍搞得节奏搞乱了,还好后来三开做题才把