记录想地很慢的和想地很快的贪心和构造和猜
https://codeforces.com/contest/2034/problem/D
1.注意到1和2的数量是不变的。
2.注意到最终需要是非严格递增的。所以我们知道最终数组应该长什么样。
3.注意到因为要最小化操作次数,所以后面的值没理由加到前面的值上。
4.注意到如果2要转移到后面,只能与1交换。
5.从后往前遍历,如果当前位置是1,且最终为2,则一定需要从前面拿个1到当前位置。注意到越前面的2一定要减少,因为当前位置比2小。而最后面的2不一定要减少,因为可能枚举到这个2的时候,后面的都是2,所以它不一定要减少。因此选择最前面的2,与当前位置进行操作。
6.如果当前位置是0,且最终大于0,则一定需要从前面拿个1到当前位置。同样拿最前面的1。数据保证一定有解,我们如果每次枚举的时候直接把当前位置加到最终的值,一定会有一个1在前面的。
https://codeforces.com/contest/2047/problem/D
1.注意到如果$a[i-1] > a[i]$,做一次操作就能变得更优。
2.注意到如果有多个这样的对,我们应该优先选择拥有最小的$a[i-1]$对进行操作,不然移到最后面后还会产生这样的逆序对。
3.模拟这个操作不好做,脑测最终的结果长什么样。跑一遍单调栈,此时所有出栈的值代表都会移到后面,由于每次我们选择最小的值+1移到最后面,此时最后面这一坨是递增的。
4.但是移到最后面后还可能产生新的逆序对,有可能在中途已经更新了当前栈里面的值。为了得到这个结果,用一个优先队列模拟我们第3步出栈的数。让优先队列里的每一个数入单调栈,然后新出栈的数+1之后加入优先队列。直到优先队列空为止。
5.逆序栈里结果得到答案。
https://codeforces.com/contest/2034/problem/E
1.求和公式得出,n为偶数时,k一定也为偶数。
2.k=1 n=1的情况特殊处理
3.如果k为偶数,则要求每一列的和为(n+1)*k/2。此时每一个排列a,都有一个对应排列b,$b[i] = n+1-a[i] $,使得这一对的列和为n+1,如此找出n/2对即可。上限一共有$n!/2$
4.如果k为奇数。暴力找规律(规律见代码)。发现是3个找规律得到的排列,加上第2步的一个个对,组成最终答案。注意后面找的对不能是前3个排列,也不能是前3个排列按2规则得到的对应排列。上限有$3 + (n!-6)/2 = n!/2$ 种。
https://codeforces.com/contest/2034/problem/C
1.有些格子是一定能逃脱的。可以dfs出来
2.有些格子最终会导向问号格子。可以dfs出来
3.导向问号格子的格子,最终的问号格子只需要反向指向导入的格子,就能实现闭环,所以一定算作答案中。
4.如果一个问号格子四周都是逃脱格子,则这个问号格子不能算作答案中。
https://codeforces.com/gym/105257/problem/L
1.0的最低位是0
2.如果一个数最低位是0,则下一次取必定把它的最低位变为非0
3.如果一个数的最低位不是0,则下一次取必定可以把它的最低位变为0
4.最低位为0时必败态。
5.答案是这个数的最小非因子。不是很会求最小非因子,用了个笨方法。最小非因子来自:第一个比最大质因子大的质数。最小的$p_i^{k_i+1}$,即质因数分解后,这个质因子在乘一次自己。
https://ac.nowcoder.com/acm/contest/97443/C
给一个字符串s,可以任意添加字符。添加后的字符串的最小循环节。
刚开始做的时候想偏了,一直被一个错误的直觉困扰,老想尽量少的添加字符。。。
注意到如果原字符串里有一个字符x,那么每个循环节里都需要有这个字符。
注意到,如果我们确定循环节是字符串a,我们可以对s中的每一个字符,给它添加a中的其他字符,然后构成循环节a。
因此得到答案,因为循环节中需要包含所有出现过的字符,所以循环节的最小长度是,原字符串的不同字符个数